Problem:
Du har två kolumner av typen timestamp
och du vill beräkna skillnaden mellan dem.
Exempel:
I travel
tabell, det finns tre kolumner:id
, departure
och arrival
. Du vill beräkna skillnaden mellan arrival
och departure
.
travel
tabellen ser ut så här:
id | avgång | ankomst |
---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 |
2 | 2019-09-12 15:50:00 | 2019-10-23 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 |
Lösning 1 (skillnad i dagar):
SELECT id, departure, arrival, JULIANDAY(arrival) - JULIANDAY(departure) AS difference FROM travel;
Resultatet är:
id | avgång | ankomst | skillnad |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10,8125 |
2 | 2019-09-12 15:50:00 | 2019-10-23 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 |
Diskussion:
För att beräkna skillnaden mellan tidsstämplarna i SQLite, använd JULIANDAY()
funktion för båda tidsstämplarna, subtrahera sedan den ena från den andra. På så sätt får du skillnaden i dagar. Heltalsdelen av skillnaden är antalet hela dagar, och decimaldelen representerar en deldag.
JULIANDAY()
funktion returnerar antalet dagar sedan kl. Greenwich Mean Time den 24 november 4714 f.Kr. Du kan läsa mer om denna funktion i dokumentationen.
Lösning 2 (skillnad i sekunder):
SELECT id, departure, arrival, ROUND((JULIANDAY(arrival) - JULIANDAY(departure)) * 86400) AS difference FROM travel;
Resultatet är:
id | avgång | ankomst | skillnad |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 934200 |
2 | 2019-09-12 15:50:00 | 2019-10-23 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 |
Diskussion:
Om du vill beräkna skillnaden mellan tidsstämplarna i sekunder, multiplicera decimalskillnaden i dagar med antalet sekunder på en dag, vilket är lika med 24 * 60 * 60 = 86400
, eller produkten av antalet timmar på en dag, antalet minuter i en timme och antalet sekunder i en minut. Eftersom decimaldelarna för skillnaden i dagar inte är 100 % korrekta på grund av avrundningsfel, kan du få en decimaldel som inte är noll. Avrunda resultatet till närmaste heltal med ROUND()
funktion, löser problemet.
På samma sätt kan du beräkna skillnaden i minuter eller i timmar. Ändra bara * 86400 to * 3600
(minuter) eller * 60
(timmar).