Denne artikel ser på forskellen mellem to MySQL-funktioner; DATEDIFF()
og TIMESTAMPDIFF()
.
Begge funktioner returnerer forskellen mellem to datoer og/eller tidspunkter, men resultatet er forskelligt mellem de to funktioner.
Følgende tabel opsummerer forskellen mellem disse to funktioner:
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
Kræver 2 argumenter. | Kræver 3 argumenter. |
Trækker det 2. argument fra det 1. (udtr1 − udtr2). | Trækker det 2. argument fra det 3. (udtr2 − udtr1). |
Resultatet er udtrykt som en værdi i dage. | Resultatet er udtrykt som den enhed, der leveres af det første argument. |
Kan kun sammenligne datoværdien af dens argumenter. | Kan sammenligne dato- og tidsværdien af dens argumenter. |
Eksempel 1 – Grundlæggende betjening
Her er et eksempel, der viser, hvordan disse funktioner fungerer, og hvordan resultaterne er forskellige, selv når du bruger den samme enhed.
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+
Så begge funktioner returnerer forskellen i dage, men det ene resultat er positivt og det andet negativt. Dette er fordi DATEDIFF()
trækker den anden dato fra den første, hvorimod TIMESTAMPDIFF()
trækker den første dato fra den anden.
Eksempel 2 – Ændring af enheden
Som det foregående eksempel viser, er TIMESTAMPDIFF()
giver dig mulighed for at angive en enhed for resultaterne, der skal returneres som (faktisk kræver dig for at angive enheden). På den anden side, DATEDIFF()
tillader dig ikke at angive en enhed. Det returnerer kun resultatet på dage.
Så vi kunne ændre det forrige eksempel, så TIMESTAMPDIFF()
returnerer antallet af timer i stedet for dage:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -24 | +----------+---------------+
Du kan gå hele vejen til mikrosekunder:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -86400000000 | +----------+---------------+
Eksempel 3 – Præcision
Præcisionen af DATEDIFF()
er en dag, og TIMESTAMPDIFF()
kan gå ned til mikrosekund. Men præcisionen af TIMESTAMPDIFF()
(og den enhed, den sammenligner) afhænger stadig af den angivne enhed.
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-10 23:59:59'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Resultat:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | 0 | 0 | 23 | 1439 | 86399 | 86399000000 | +----------+------+-------+---------+---------+--------------+
Og her er resultatet, hvis vi øger den anden dato med ét sekund (hvilket bringer den til den næste dag):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-11 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Resultat:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | -1 | 1 | 24 | 1440 | 86400 | 86400000000 | +----------+------+-------+---------+---------+--------------+
Her er endnu et eksempel, denne gang for at se, hvordan det ser ud, når vi returnerer måneder, kvartaler og år, når forskellen er en måned (eller 31 dage):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-11-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(month, @date1, @date2) AS 'Month', TIMESTAMPDIFF(quarter, @date1, @date2) AS 'Quarter', TIMESTAMPDIFF(year, @date1, @date2) AS 'Year';
Resultat:
+----------+------+-------+---------+------+ | DATEDIFF | Days | Month | Quarter | Year | +----------+------+-------+---------+------+ | -31 | 31 | 1 | 0 | 0 | +----------+------+-------+---------+------+
Eksempel 4 – Forkerte argumenttyper
Begge funktioner returnerer null, hvis de sendes til den forkerte argumenttype.
SET @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | NULL | +----------+---------------+
Eksempel 5 – Blandede argumenttyper
Begge funktioner giver dig mulighed for at angive en dato som et argument og en datetime som et andet argument.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+