Uren tellen met DATETIME
Het zit zo:
Ik heb een tabel 'vluchten'. Hierin worden alle vluchten van een vliegveld in gezet.
Deze tabel heeft een kolom 'opstijgtijd' en 'aankomsttijd'. Allebei zijn in DATETIME gedefinieerd. Een voorbeeld van de tabel:
ID aankomsttijd piloot_id
0 2011-11-28 16:10:00 2011-11-28 16:50:00 1
1 2011-12-25 12:56:00 2011-12-25 18:00:52 1
Mijn vraag is nu: Hoe schrijf ik de query (of een combinatie van PHP en sql) die per jaar (of ieder ander tijdseenheid) het totaal aantal vlieguren van een bepaald persoon uitrekent (in dit geval persoon/piloot met id '1'.
Alvast bedankt!
Gewijzigd op 21/12/2011 23:33:10 door Robin Djie
Code (php)
1
2
3
4
2
3
4
SELECT SUM(TIMESTAMPDIFF(HOUR, arrival, departure)) flighthours
FROM flightdata
WHERE pilot_id='1'
AND arrival BETWEEN '2011-01-01' AND NOW()
FROM flightdata
WHERE pilot_id='1'
AND arrival BETWEEN '2011-01-01' AND NOW()
Gewijzigd op 22/12/2011 08:14:30 door Ger van Steenderen
En vergeet je niet de AS tussen sum(...) en filghthour?
Wouter, AS is optioneel en en getallen mogen tussen quotes in MySQL
Met de AS heb je overigens wel gelijk, die gebruikte ik vroeger ook veel maar in veel database systemen is dat niet verplicht inderdaad.
Gewijzigd op 22/12/2011 10:00:49 door kees Schepers
Daar heb je ook weer gelijk in Kees, maar een ID is niet persee een integer vandaar de quotes
Bedankt jongens! Het werkt!
Ik vind het precies zoals in PHP:
Is gewoon fout PHP, ja PHP keurt het goed, maar het is gewoon goed fout. Dat werkt ook zo in SQL, id='1' is gewoon fout SQL maar het wordt inderdaad helaas wel goed gerekend.
Wouter J op 22/12/2011 09:30:44:
Alleen is pilot_id='1' fout. 1 is geen string, maar een cijfer dus zonder quotes: pilot_id=1
En vergeet je niet de AS tussen sum(...) en filghthour?
En vergeet je niet de AS tussen sum(...) en filghthour?
2x onzin, voor de database is het datatype gedefinieerd in de tabelstructuur en totaal niet afhankelijk van een quote of geen quote. Zie de handleiding van jouw database.
Er zijn datatypes waar het gebruik van quotes verplicht is, maar dat is wat anders.
AS is volgens de SQL standaarden optioneel en dus valt er niets te vergeten.
Toevoeging op 25/12/2011 14:22:33:
Wouter J op 22/12/2011 18:10:55:
Dit is niet fout! Het is met MySQL zelfs noodzakelijk wanneer je met mysql_real_escape_string() jezelf probeert te beschermen tegen SQL injection.
En mocht het volgens jou toch fout zijn, kun je dan even een linkje naar de handleiding van MySQL geven waarin staat dat het fout is om quotes te gebruiken?
Gewijzigd op 25/12/2011 14:20:38 door Bartje Jansen
Bartje Jansen:
Dit is niet fout! Het is met MySQL zelfs noodzakelijk wanneer je met mysql_real_escape_string() jezelf probeert te beschermen tegen SQL injection.
En daarom moet je mysql_real_escape_string ook alleen maar bij strings gebruiken en niet bij getallen. Bij getallen gebruik je typecasten zoals dat heet. Bijv:
Code (php)
1
2
3
4
5
2
3
4
5
$mijnString = 'Wouter';
$mijnGetal = '10';
var_dump( (int) $mijnString); // Geeft int 0
var_dump( (int) $mijnGetal); // Geeft int 10
$mijnGetal = '10';
var_dump( (int) $mijnString); // Geeft int 0
var_dump( (int) $mijnGetal); // Geeft int 10
Bertje Jansen:
En mocht het volgens jou toch fout zijn, kun je dan even een linkje naar de handleiding van MySQL geven waarin staat dat het fout is om quotes te gebruiken?
Dat kan ik niet, maar ik kan het je wel nog een keer logisch proberen uit te leggen. Ik neem nu even PHP als voorbeeld, maar deze regels werken in elke taal (dus ook SQL).
In PHP hebt je verschillende types. Een van die types is een string. Een string is een stuk tekst en je maakt een string door de value tussen quotes te zetten (enkel of dubbel, maakt in de meeste talen niet uit (C# kan alleen dubbel)). $var = 'Wouter' hierbij is Wouter een string.
Een ander type is Intergers (afgekort int). Dit wordt gebruikt voor getallen, deze getallen worden zonder quotes geschreven. Mocht het met quotes worden geschreven dan wordt dit getal niet gezien als een int, maar als een string. Het is immers tussen quotes.
Nu gaan we terug naar het voorbeeld, hierbij hebben we het getal 1. Een getal is een int en geen string, dus we gebruiken de methode om een int te schrijven: Zonder quotes.
En ja, nogmaals, het mag wel met quotes. Alleen dat is omdat veel scripttalen vriendelijk zijn. Ze zeggen, ach er zullen veel gebruikers zijn die dit fout gaan doen, laten we int tussen quotes ook maar goed rekenen. Het wordt dus wel gedaan en het mag ook, maar het is niet strict correct.
probeer maar eens in asp.net dit soort geintejs