Problem:
Du har to kolonner af typen timestamp
og du vil beregne forskellen mellem dem.
Eksempel:
I travel
tabel, er der tre kolonner:id
, departure
, og arrival
. Du vil gerne beregne forskellen mellem arrival
og departure
.
travel
tabellen ser sådan ud:
id | afgang | 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 (forskel i dage):
SELECT id, departure, arrival, JULIANDAY(arrival) - JULIANDAY(departure) AS difference FROM travel;
Resultatet er:
id | afgang | ankomst | forskel |
---|---|---|---|
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:
For at beregne forskellen mellem tidsstemplerne i SQLite skal du bruge JULIANDAY()
funktion for begge tidsstempler, og træk derefter det ene fra det andet. På denne måde får du forskellen i dage. Heltalsdelen af forskellen er antallet af hele dage, og decimaldelen repræsenterer en delvis dag.
JULIANDAY()
funktion returnerer antallet af dage siden kl. Greenwich Mean Time den 24. november 4714 f.v.t. Du kan læse mere om denne funktion i dokumentationen.
Løsning 2 (forskel i sekunder):
SELECT id, departure, arrival, ROUND((JULIANDAY(arrival) - JULIANDAY(departure)) * 86400) AS difference FROM travel;
Resultatet er:
id | afgang | ankomst | forskel |
---|---|---|---|
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:
Hvis du gerne vil beregne forskellen mellem tidsstemplerne i sekunder, skal du gange decimalforskellen i dage med antallet af sekunder på en dag, hvilket svarer til 24 * 60 * 60 = 86400
, eller produktet af antallet af timer i en dag, antallet af minutter i en time og antallet af sekunder i et minut. Da decimaldelene for forskel i dage ikke er 100 % nøjagtige på grund af afrundingsfejl, kan du få en ikke-nul decimaldel. Afrunding af resultatet til nærmeste heltal ved hjælp af ROUND()
funktion, løser problemet.
På samme måde kan du beregne forskellen i minutter eller timer. Du skal bare ændre * 86400 to * 3600
(minutter) eller * 60
(timer).