Problém:
Máte dva sloupce typu timestamp 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 ve dnech):
SELECT id, departure, arrival, JULIANDAY(arrival) - JULIANDAY(departure) AS difference FROM travel;
Výsledek je:
| id | odjezd | příjezd | rozdíl |
|---|---|---|---|
| 1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10,8125 |
| 2 | 2019-09-12 15:50:00 | 23. 10. 2019 10:30:30 | 40,778125000186265 |
| 3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0,18437499972060323 |
| 4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368,2256944444962 |
Diskuse:
Chcete-li vypočítat rozdíl mezi časovými razítky v SQLite, použijte JULIANDAY() funkce pro obě časová razítka, pak odečtěte jedno od druhého. Tímto způsobem získáte rozdíl ve dnech. Celočíselná část rozdílu je počet celých dnů a desetinná část představuje částečný den.
JULIANDAY() funkce vrací počet dní od poledne greenwichského středního času 24. listopadu 4714 př. Více o této funkci si můžete přečíst v dokumentaci.
Řešení 2 (rozdíl v sekundách):
SELECT id, departure, arrival, ROUND((JULIANDAY(arrival) - JULIANDAY(departure)) * 86400) AS difference FROM travel;
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:
Pokud chcete vypočítat rozdíl mezi časovými razítky v sekundách, vynásobte desetinný rozdíl ve dnech počtem sekund v den, což se rovná 24 * 60 * 60 = 86400 nebo součin počtu hodin v den, počtu minut v hodině a počtu sekund v minutě. Protože desetinné části pro rozdíl ve dnech nejsou 100% přesné kvůli chybám v zaokrouhlování, můžete získat nenulovou desetinnou část. Zaokrouhlení výsledku na nejbližší celé číslo pomocí ROUND() funkce, řeší problém.
Podobně můžete vypočítat rozdíl v minutách nebo v hodinách. Stačí změnit * 86400 to * 3600 (minuty) nebo * 60 (hodiny).