sql >> Database teknologi >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMESTAMPDIFF():Hvad er forskellen?

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 |
+----------+---------------+

  1. Sådan får du den sidste dag i måneden i MySQL

  2. Dvale annotering for PostgreSQL seriel type

  3. Check Constraint Calling af en funktion Oracle SQL-udvikler

  4. Lære 2 og Mange-til-mange linktabel med et ekstra felt