Database.Guide
On januar 27, 2022 by adminDenne artikel ser på forskellen mellem to MySQL-funktioner; DATEDIFF()
og TIMESTAMPDIFF()
.
Både funktioner returnerer forskellen mellem to datoer og/eller tidspunkter, men resultatet er forskelligt mellem de to funktioner.
Den følgende tabel opsummerer forskellen mellem de to funktioner:
DATEDIFF() |
TIMESTAMPDIFF() |
|
---|---|---|
Kræver 2 argumenter. | Kræver 3 argumenter. | |
Subtraherer det 2. argument fra det 1. (expr1 – expr2). | Subtraherer det 2. argument fra det 3. (expr2 – expr1). | |
Resultatet udtrykkes som en værdi i dage. | Resultatet udtrykkes som den enhed, der er angivet af det første argument. | |
Kan kun sammenligne datoværdien af sine argumenter. | Kan sammenligne dato- og tidsværdien af sine argumenter. |
Eksempel 1 – Grundlæggende operation
Her er et eksempel, der viser, hvordan disse funktioner fungerer, og hvordan resultaterne er forskellige, selv når de 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 dog positivt og det andet negativt. Det skyldes, at DATEDIFF()
subtraherer den anden dato fra den første, mens TIMESTAMPDIFF()
subtraherer den første dato fra den anden.
Eksempel 2 – Ændring af enhed
Som det fremgår af det foregående eksempel, giver TIMESTAMPDIFF()
dig mulighed for at angive en enhed, som resultaterne skal returneres som (faktisk kræver den, at du angiver enheden). På den anden side giver DATEDIFF()
dig ikke mulighed for at angive en enhed. Den returnerer kun resultatet i dage.
Så vi kan ændre det foregående 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 for DATEDIFF()
er en dag, og TIMESTAMPDIFF()
kan gå ned til mikrosekunder. Præcisionen for TIMESTAMPDIFF()
(og den enhed, som den sammenligner) afhænger dog 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 2. dato med et 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 et andet eksempel, hvor vi denne gang ser, 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
Både funktioner returnerer nul, hvis de får overdraget 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
Både funktioner giver mulighed for at angive en dato som det ene argument og en datotid som det 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 |+----------+---------------+
Skriv et svar