Just nu i M3-nätverket
Gå till innehåll

Räkna ut antalet dagar mellan 2 datum


Poj

Rekommendera Poster

Hej. Jag försöker räkna ut antalet dagar mellan 2 datum i en databas tabell.

 

Jag har försökt följande

 

 
<?php $date=$row_Recordset4['MAX(datum)']-$row_Recordset4['startdatum'];?>
<?php echo $date; ?>

 

startdatum ser ut så här 2008-11-01 och datum ser ut så här 2008-11-09 20:14:14 .

Jag vill veta hur många dagar som skiljer mellan datumen, hur gör man?

 

Länk till kommentar
Dela på andra webbplatser

en tanke...

 

konvertera datumet till unixtid...

tid2 - tid1 = skillnad i sekunder / 60 / 60 / 24 = skillnad i dagar.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Kan jag ersätta datumen ($days = (strtotime("2005-11-20") - strtotime("2005-11-26")) / (60 * 60 * 24);

print $days;) med variablerna från databasen ?

 

Länk till kommentar
Dela på andra webbplatser

funktionen tar en sträng som argument, returnerar TRUE on success annars FALSE.

http://se.php.net/manual/en/function.strtotime.php

 

En sak bara...

Enligt php-docs, förväntar sig strtotime() att argumentet ska vara i us-datumformatet.

 

Skriv ett testscript och testa om det går bra med det svenska formatet. Annars, blir du tvungen att lösa det genom att...

 

 

Antigen

http://se.php.net/manual/en/function.date-default-timezone-set.php

 

eller

måste du konvertera det svenska formatet till det amerikanska innan du passar det till funktionen.

 

...

Kör MySQL-sättet istället. Det enda du behöver är att göra en liten ändring i din sql-fråga.

 

Ex.

SELECT ANVANDARNAMN, DATEDIFF(AVSLUTAT_DATUM, REGISTRERAT_DATUM) AS ANTAL_DAGAR_SOM_MEDLEM FROM ANVANDARE

 

I php gör du så för att komma åt timmarna.

$row = mysql_fetch_row($result);

print(”Antal dagar: $row[1]”);

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Det är en databas för en stegräknar tävling jag försöker få att fungera.

Jag har 2 tabeller en med namn anställningsnummer och lag tillhörighet och den andra tabelen lagras anställningsnummer, antal steg, timestamp och startdatum.

 

Jag kör en fråga för att summera alla inrapporterade steg som den anställde har tagit och behöver då antalet dagar mellan startdatum och den senaste rapporteringen.

 

Min sql fråga ser ut så här nu:

SELECT `data`.startdatum, MAX(datum)
FROM `data`
WHERE person_annr = colname

 

Hur får jag in DATEDIFF i den frågan ?

 

Länk till kommentar
Dela på andra webbplatser

Okey..:) Nu har jag fått till det.

SELECT person_annr, DATEDIFF(MAX(datum) ,startdatum )
FROM `data`
GROUP BY person_annr

Här får jag fram antal dagar för varje person som lagrat resultat.

Nu behöver jag dividera resultatet med antal steg för att få fram snitt / dag.

Hur gör jag?

Antal steg som är inrapporterade får jag fram med följande sql fråga

SELECT person_annr, sum(steg)
FROM `data`
GROUP BY person_annr

 

Har försökt dividera men får 0 som resultat....

[inlägget ändrat 2008-11-15 19:40:17 av Poj]

Länk till kommentar
Dela på andra webbplatser

Här går det undan.

Jag lyckades köra båda frågorna i samma sql sats.

SELECT person_annr, sum(steg), DATEDIFF(MAX(datum) ,startdatum )
FROM `data`
GROUP BY person_annr

Och får fram det så här

<?php echo $row_Recordset4['sum(steg)']/$row_Recordset4['DATEDIFF(MAX(datum) ,startdatum )']; ?>

 

Ska försöka runda av resultatet för jag får en massa decimaler....

 

Länk till kommentar
Dela på andra webbplatser

SELECT person_annr, SUM(steg) AS totala_steg, DATEDIFF(datum, startdatum) AS antal_dagar

FROM data

WHERE person_annr = 1

GROUP BY person_annr

ORDER BY datum DESC

LIMIT 1

 

 

Hos mig funkar det fint. Men då ska varken datum eller startdatum för personen med person_annr = ? får vara NULL.

 

Om det är så att en eller båda datumkolumnerna kan vara (NULL), så ska WHERE-delen se ut så här

 

WHERE person_annr = 1 AND datum IS NOT NULL AND startdatum IS NOT NULL

 

Jag ersatte MAX() med ORDER BY DESC och la till LIMIT 1 för att bara visa det senast rapporterade datumet i en enda rad.

 

 

DATEDIFF(datum, startdatum) är alltså

datum - startdatum == skillnaden i dagar.

 

[inlägget ändrat 2008-11-15 23:40:32 av Phenomen]

Länk till kommentar
Dela på andra webbplatser

Jag kan visa hur mina två tabeller ser ut

Detta är 'person' tabellen

Fält Typ Null Standard

id int(10) Nej

annr int(10) Nej

lag int(10) Ja NULL

namn varchar(40) Nej

 

detta är 'data' tabellen

 

Fält Typ Null Standard

id int(10) Nej

person_annr int(10) Nej

steg int(10) Nej

datum timestamp Nej CURRENT_TIMESTAMP

startdatum date Nej 2008-11-01

 

Tabell 'person' är lagrad med anställningsnummer ,namn och lag. Det ingår tre personer i varje lag. Den anstälde skriver in sitt anställningsnummer i ett sökformulär och kommer till en sida där dom ser sitt namn och lagtillhörighet, där finns ett formulär för att lagra steg + anställningsnummer i 'data' tabellen. Därefter kommer dom till en sida som säger att dom skall nollställa stegräknaren.

 

Vill man sen se sitt resultat och snitt får man skriva sitt anställningsnummer på en ny söksida och därefter får man fram sina uppgifter.

 

Här skulle jag vilja komma direkt efter att man lagrat sina steg men jag vet inte hur man får med sitt anställningsnummer den sidan.

 

Jag försöker också få fram lagets totala steg och snitt, det fick jag med denna fråga:

 
SELECT person.lag, `data`.steg,SUM(steg)
FROM person, `data`
WHERE person.lag AND person.annr = `data`.person_annr
GROUP BY person.lag

 

 

 

Poj.

 

[inlägget ändrat 2008-11-16 17:44:49 av Poj]

Länk till kommentar
Dela på andra webbplatser

Jag har ett problem till.

Jag vet inte hur jag skall ställa denna fråga i sql.

Hur får jag ut mitt lags sammanlagda steg? , jag skickar en variabel iform av mitt anställningsnummer (annr) . Hur tabellerna ser ut ser ni i föregåenede svar.

 

Jag får ut alla lagen så här

SELECT person.lag, `data`.steg,SUM(steg)
FROM person, `data`
WHERE person.lag AND person.annr = `data`.person_annr
GROUP BY person.lag
ORDER BY SUM(steg) DESC

och mitt eget resultat så här:

SELECT person_annr, sum(steg), DATEDIFF(MAX(datum) ,startdatum )
FROM `data`
WHERE person_annr = colname
GROUP BY person_annr

 

 

Länk till kommentar
Dela på andra webbplatser

Du kan inte kombinera SUM(steg) och datediff som du gör det ( vilket visar sig )

 

Förklara lite mer vad du vill få ut av det hela.

 

Länk till kommentar
Dela på andra webbplatser

Jo det fungerar :thumbsup: båda kodsnuttarna fungerar.

Det jag vill veta är hur jag skall få fram mitt lags resultat (varje lag består av 3 personer). Namnen på lagkamraterna och den sammanlagda antalet steg.

Jag visar bara koden för hur jag får fram alla lagen och mitt eget resultat.

 

Lite bättre förklaring:

I person tabellen vill jag hitta mitt anställningsnr (annr) (som finns i variabeln colname) när det är hittat skall jag läsa av mitt lagnr och hitta dom andra med samma lagnr, ta deras annr och gå till data tabellen och hitta samma anställningsnummer i person_annr columnen och räkna ihop stegen för laget.

 

 

[inlägget ändrat 2008-11-20 21:46:29 av Poj]

Länk till kommentar
Dela på andra webbplatser

Satt och försökte böka ihop en query med nån form av join, men det enklaste är väl ändå om du bara kör 2 frågor:

 

SELECT lag from person where annr=colname;

för att få ut lagnumret

och

 

select SUM(data.steg), person.lag from person inner join data on person.annr=data.pers_annr where person.lag=variabel_med_laget group by person.lag;

för att få ut totala antal steg i laget.

 

Enkelt och fult, men det lär garanterat fungera i alla fall....

 

[inlägget ändrat 2008-11-21 23:14:00 av jomentjena]

Länk till kommentar
Dela på andra webbplatser

Jag får det inte att fungera!!!

Jag använder dreamweaver's postmängd Recordset.

Jag får ett felmeddelande när jag testar:MM_ERROR: MySQL Error#: 1054 Unknown column 'data.pers_annr' in 'on clause'

 

Kan jag köra båda frågorna i samma recordset?

Hur använder jag variabeln variabel_med_laget ??

 

Jag vill verkligen få detta att fungera..

 

PS. Jag har ändrat i tabellerna jag har flyttat startdatum från data till person tabellen. DS.

 

[inlägget ändrat 2008-11-22 19:57:41 av Poj]

Länk till kommentar
Dela på andra webbplatser

Svaret står ju i felmeddelandet. Du har angett fältnamnet data.pers_annr i din join-query men fältet heter ju faktiskt inte så, utan data.person_annr

 

Felmeddelanden skall man alltid analysera noga, eftersom svaren oftast ganska enkelt går att hitta däri.

 

Länk till kommentar
Dela på andra webbplatser

Enkelt för dom som kan, jag har inte jobbat så mycket med mysql men försöker lära mig.

Jag skrev koden så här nu:

SELECT lag from person where annr=colname; 
SELECT SUM(data.steg), person.lag
FROM person inner join data on person.annr=data.person_annr
WHERE person.lag=variabel_med_laget
GROUP BY person.lag

colname är en formulär variabel med mitt anställningsnummer.

 

Jag får detta felmeddelande nu:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; select SUM(data.steg), person.lag from person inner join data on person.annr=d' at line 1

 

Kan jag köra båda frågorna så här? eller måste jag köra dom var för sig.

hanterar jag variabel_med_laget rätt?

 

Länk till kommentar
Dela på andra webbplatser

Allting fungerar på min test server Mysql 5.0.51b men när jag skulle lägga upp det på nätet så får jag felmeddelande;

MySQL Error#:1111

Invalid use of group funktion

 

SELECT person.lag, `data`.steg,SUM(steg)

FROM person, `data`

WHERE person.lag AND person.annr = `data`.person_annr

GROUP BY person.lag

ORDER BY SUM(steg) DESC

 

Webhotellet kör med Mysql 4.0.21

Något skilljer tydligen mellan versionerna men vad?

Hur löser jag det?

 

 

Poj.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.



×
×
  • Skapa nytt...