Problém:
Máte dva sloupce typu datetime
a chcete vypočítat rozdíl mezi nimi.
Příklad:
V travel
tabulka má tři sloupce:id
, departure
a arrival
. Chcete vypočítat rozdíl mezi arrival
a departure
.
travel
tabulka vypadá takto:
id | odjezd | příjezd |
---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 |
2 | 2019-09-12 15:50:00 | 23. 10. 2019 10:30:30 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 |
Řešení 1 (rozdíl v sekundách):
VYBRAT id, odjezd, příjezd, DATEDIFF(sekunda, odjezd, příjezd) AS rozdíl od cesty;
Výsledek je:
id | odjezd | příjezd | rozdíl |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 934200 |
2 | 2019-09-12 15:50:00 | 23. 10. 2019 10:30:30 | 3523230 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 15930 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 31814700 |
Diskuse:
Pro výpočet rozdílu mezi arrival
a odchod v T-SQL, použijte DATEDIFF(datepart, startdate, enddate)
funkce. datepart
argument může být microsecond
, second
, minute
, hour
, day
, week
, month
, quarter
nebo year
. Zde byste chtěli získat rozdíl v sekundách, takže vyberte druhou. Chcete-li získat rozdíl v hodinách, vyberte hour
; pro rozdíl v měsících zvolte month
, atd. startdate
a enddate
argumenty jsou počáteční a koncové datetime
sloupců (zde departure
a arrival
, respektive).
Řešení 2 (rozdíl ve dnech, hodinách, minutách a sekundách):
WITH rozdíl_v_sekundách AS ( SELECT id, odjezd, příjezd, DATEDIFF(SECOND, odjezd, příjezd) AS sekund FROM cesty),rozdíly AS ( SELECT id, odjezd, příjezd, sekundy, sekundy % 60 AS část_sekund, sekund % 3600 AS minut_část, sekundy % (3600 * 24) AS část_hodin FROM rozdíl_v_sekundách)SELECT id, odjezd, příjezd, CONCAT( FLOOR(sekundy / 3600 / 24), ' dny ', FLOOR(část_hodin / 3600), ' hodiny ', FLOOR(část_minut / 60), ' minutes ', seconds_part, ' seconds' ) AS differentFROM Rozdíly;
Výsledek je:
id | odjezd | příjezd | rozdíl |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 dní 19 hodin 30 minut 0 sekund |
2 | 2019-09-12 15:50:00 | 23. 10. 2019 10:30:30 | 40 dní 18 hodin 40 minut 30 sekund |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 dnů 4 hodin 25 minut 30 sekund |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 dní 5 hodin 25 minut 0 sekund |
Diskuse:
Nejprve vypočítejte rozdíl mezi arrival
a departure
v sekundách pomocí DATEDIFF()
funkce (první CTE s názvem difference_in_seconds
), stejně jako v řešení 1. Poté spočítejte, kolik sekund překračuje celé minuty (seconds_part
), který se později použije k výpočtu sekund, kolik sekund překračuje celé hodiny (minutes_part
), který se později použije k výpočtu minut a počtu sekund, které překračují celé hodiny (hours_part
), který se použije později k výpočtu hodin.
Chcete-li to provést, použijte operátor %. Například hodina má 3600 sekund, abyste zjistili, kolik sekund má v minutes_part
, najděte zbytek z dělení 3600 takto:
seconds % 3600 AS minutes_part
Podobně existují 3600 * 24
sekund za den, takže vypočítat, kolik sekund je v hours_part
, napište:
seconds % (3600 * 24) AS hours_part
Jakmile jsou tyto zbytky vypočteny (ve druhém CTE, nazvaném differences
), můžete konečně získat rozdíl ve dnech, hodinách, minutách a sekundách. Chcete-li získat počet sekund, minut, hodin a dnů, vydělte zbývající počet sekund odpovídajícím počtem sekund ve dnech, hodinách nebo minutách. Chcete-li například zjistit, kolik minut by se mělo zobrazit, použijte minutes_part
a vydělte to 60, protože hodina má 60 minut. Z tohoto potřebujete pouze celočíselnou část (tj. bez desetinné části), proto použijte FLOOR()
fungovat takto:
FLOOR(minutes_part / 60)
Nakonec musíte jednoduše zobrazit v jednom řetězci to, co jste vypočítali. Chcete-li to provést, použijte CONCAT()
funkce ve vnějším dotazu:
CONCAT( FLOOR(sekundy / 3600 / 24), ' dny ', FLOOR(část_hodin / 3600), ' hodiny ', FLOOR(část_minut / 60), 'minuty', část_sekund, 'sekundy') AS rozdílZde uvedené řešení vrací
datetime
rozdíl jako text. Řešení můžete snadno upravit tak, abyste získali pouze čísla bez jakéhokoli textu. Můžete také ukládat dny, hodiny, minuty a sekundy do různých sloupců:FLOOR(sekundy / 3600 / 24) AS dny,FLOOR(část_hodin / 3600) AS hodiny,FLOOR(část_minut / 60) AS minuty,část_sekund AS sekund