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

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

To datofunktioner inkluderet i MySQL er DATEDIFF() og TIMEDIFF() .

Begge funktioner gør det samme, men med nogle betydningsfulde forskelle.

Følgende tabel opsummerer forskellen mellem disse to funktioner:

DATEDIFF() TIMEDIFF()
Resultatet er udtrykt som en værdi i dage. Resultatet er udtrykt som en tidsværdi.
Sammenligner kun datoværdien af ​​dens argumenter. Sammenligner tidsværdien af ​​dens argumenter.
Accepterer dato- eller dato-og-tidsudtryk. Accepterer klokkeslæt eller dato-og-tidsudtryk.
Begge argumenter kan være af forskellig type (dato eller dato-og-klokkeslæt). Begge argumenter skal være af samme type (enten klokkeslæt eller dato-og-klokkeslæt).

Eksempel 1 – Grundlæggende forskel

Her er et eksempel, der viser den grundlæggende forskel mellem disse funktioner.

SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

Resultat:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | 24:00:00 |
+----------+----------+

Så vi kan se den DATEDIFF() returnerede 1 , hvilket betyder "1 dag", og TIMEDIFF() returnerede 24:00:00 som er tidsrepræsentationen af ​​præcis 1 dag.

Eksempel 2 – Angivelse af en tidsværdi

Lad os se, hvad der sker, hvis vi øger tidsværdien af ​​en af ​​variablerne.

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

Resultat:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | 36:15:35 |
+----------+----------+

DATEDIFF() returnerer det samme resultat som i det foregående eksempel. Dette skyldes, at den kun sammenligner datoværdierne (den ignorerer eventuelle tidsværdier).

TIMEDIFF() funktion sammenligner på den anden side tiden, og derfor returnerer den et mere præcist resultat. Det viser os, at der er 36 timer, 15 minutter og 35 sekunder mellem de to dato-og-tidsværdier.

Eksempel 3 – Forkerte argumenttyper

Her er et eksempel på, hvad der sker, når du sender de forkerte argumenttyper til hver funktion.

SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF Date',
  DATEDIFF(@time1, @time2) AS 'DATEDIFF Time',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';

Resultat:

+---------------+---------------+---------------+---------------+
| DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time |
+---------------+---------------+---------------+---------------+
|             1 |          NULL | 00:00:00      | 12:15:35      |
+---------------+---------------+---------------+---------------+

Det første og sidste resultat er fint, fordi de korrekte argumenttyper blev sendt ind. De to midterste resultater havde dog den forkerte datatype, og derfor kunne det korrekte resultat ikke beregnes.

Eksempel 4 – Blandede argumenttyper

Her er, hvad der sker, hvis du angiver to forskellige datatyper til hver funktion.

SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF',
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';

Resultat:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | NULL     |
+----------+----------+

Så vi kan se den DATEDIFF() håndterer blandede datatyper fint (så længe de enten er dato eller dato-og-klokkeslæt).

Dog TIMEDIFF() kræver at begge argumenter er af samme type, så vi får NULL , selvom begge argumenter er af en type, som funktionen understøtter (tid og dato-og-tid).

Vi kan bekræfte, at begge typer faktisk understøttes af denne funktion med følgende eksempel:

SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime1, @thetime2) AS 'time',
  TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';

Resultat:

+----------+----------+
| time     | datetime |
+----------+----------+
| 02:00:00 | 48:00:00 |
+----------+----------+

  1. Hvordan kalder jeg en Oracle-lagret procedure fra et Excel VBA-script?

  2. Hvordan finder man det aktuelle transaktionsniveau?

  3. SQLPlus - spooling til flere filer fra PL/SQL-blokke

  4. MySQL-forespørgsel, der finder værdier i en kommasepareret streng