sql >> Database >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMEDIFF():wat is het verschil?

Twee datumfuncties in MySQL zijn DATEDIFF() en TIMEDIFF() .

Beide functies doen hetzelfde, maar met enkele betekenisvolle verschillen.

De volgende tabel vat het verschil tussen deze twee functies samen:

DATEDIFF() TIMEDIFF()
Het resultaat wordt uitgedrukt als een waarde in dagen. Resultaat wordt uitgedrukt als een tijdswaarde.
Vergelijkt alleen de datumwaarde van zijn argumenten. Vergelijkt de tijdswaarde van zijn argumenten.
Accepteert datum- of datum-en-tijd-expressies. Accepteert tijd- of datum-en-tijd-expressies.
Beide argumenten kunnen van een ander type zijn (datum of datum-en-tijd). Beide argumenten moeten van hetzelfde type zijn (tijd of datum-en-tijd).

Voorbeeld 1 – Basisverschil

Hier is een voorbeeld dat het fundamentele verschil tussen deze functies laat zien.

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';

Resultaat:

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

Dus we kunnen zien dat DATEDIFF() 1 geretourneerd , wat "1 dag" betekent, en TIMEDIFF() geretourneerd 24:00:00 wat de tijdweergave is van precies 1 dag.

Voorbeeld 2 – Een tijdwaarde specificeren

Laten we eens kijken wat er gebeurt als we de tijdswaarde van een van de variabelen verhogen.

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';

Resultaat:

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

Dus DATEDIFF() geeft hetzelfde resultaat als in het vorige voorbeeld. Dit komt omdat het alleen de datumwaarden vergelijkt (het negeert alle tijdwaarden).

De TIMEDIFF() functie daarentegen vergelijkt de tijd en geeft daarom een ​​nauwkeuriger resultaat. Het laat ons zien dat er 36 uur, 15 minuten en 35 seconden zijn tussen de twee datum- en tijdwaarden.

Voorbeeld 3 – Verkeerde argumenttypes

Hier is een voorbeeld van wat er gebeurt als je de verkeerde argumenttypes doorgeeft aan elke functie.

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';

Resultaat:

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

De eerste en laatste resultaten zijn prima, omdat de juiste argumenttypes zijn doorgegeven. Bij de middelste twee resultaten was echter het verkeerde gegevenstype ingevoerd en daarom kon het juiste resultaat niet worden berekend.

Voorbeeld 4 – Gemengde argumenttypes

Dit is wat er gebeurt als je twee verschillende datatypes aan elke functie geeft.

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';

Resultaat:

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

Dus we kunnen zien dat DATEDIFF() kan prima met gemengde gegevenstypes omgaan (zolang ze datum of datum-en-tijd zijn).

Echter, TIMEDIFF() vereist dat beide argumenten van hetzelfde type zijn, dus we krijgen NULL , ook al zijn beide argumenten van een type dat de functie ondersteunt (tijd en datum-en-tijd).

We kunnen bevestigen dat beide typen in feite door deze functie worden ondersteund met het volgende voorbeeld:

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';

Resultaat:

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

  1. Vervangen in querysyntaxis

  2. Unieke beperking met voorwaarden in MYSQL

  3. Overwegingen met betrekking tot gegevensintegriteit en prestatie in semisynchrone MySQL-replicatie

  4. Hoe rijnummers weergeven in PostgreSQL-query?