sql >> Database >  >> RDS >> Mysql

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

Dit artikel gaat in op het verschil tussen de MySQL TIMEDIFF() en TIMESTAMPDIFF() functies.

Beide functies doen hetzelfde, maar er zijn enkele significante verschillen tussen de twee.

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

TIMEDIFF() TIMESTAMPDIFF()
Vereist 2 argumenten. Vereist 3 argumenten.
Trekt het 2e argument af van het 1e (datum1 − datum2). Trekt het 2e argument af van het 3e (date2 − date1).
Het resultaat wordt uitgedrukt als een tijdwaarde (en heeft de beperkingen van het gegevenstype tijd). Resultaat is een geheel getal, uitgedrukt in een aantal eenheden zoals aangegeven door het eerste argument.
Accepteert tijd- of datetime-expressies. Accepteert datum- of datetime-expressies.
Beide argumenten moeten van hetzelfde type zijn (time of datetime). Beide argumenten kunnen van een ander type zijn (datum of datum/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 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';

Resultaat:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| 24:00:00 |           -24 |
+----------+---------------+

Dus we kunnen zien dat TIMEEDIFF() heeft een tijdwaarde geretourneerd, en TIMESTAMPDIFF() een geheel getal geretourneerd.

Ook TIMEEDIFF() de 2e datum afgetrokken van de 1e, terwijl TIMESTAMPDIFF() de 1e datum afgetrokken van de 2e.

Voorbeeld 2 – De eenheid wijzigen

Zoals vermeld, TIMESTAMPDIFF() stelt ons in staat om te specificeren in welke eenheid het resultaat moet worden weergegeven. Hier zijn enkele voorbeelden:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';

Resultaat:

+----------+-------+---------+---------+
| TIMEDIFF | Hours | Minutes | Seconds |
+----------+-------+---------+---------+
| 36:15:35 |   -36 |   -2175 | -130535 |
+----------+-------+---------+---------+

Dit is echter wat er gebeurt als we een eenheid gebruiken die groter is dan het werkelijke tijdsverschil:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';

Resultaat:

+----------+------+-------+--------+
| TIMEDIFF | Days | Weeks | Months |
+----------+------+-------+--------+
| 36:15:35 |   -1 |     0 |      0 |
+----------+------+-------+--------+

In dit geval was het tijdsverschil niet groot genoeg om de week- of maandwaarden te beïnvloeden.

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 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';

Resultaat:

+---------------+--------------------+
| TIMEDIFF Date | TIMESTAMPDIFF Time |
+---------------+--------------------+
| 00:00:00      |               NULL |
+---------------+--------------------+

De TIMEDIFF() ondersteunt het gegevenstype 'datum' niet, en daarom retourneert het 00:00:00 .

En de TIMESTAMPDIFF() functie ondersteunt het datatype 'tijd' niet, dus retourneert het NULL .

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 
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Resultaat:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| NULL     |           -24 |
+----------+---------------+

Dus we kunnen zien dat TIMESTAMPDIFF() kan prima met gemengde gegevenstypes omgaan (zolang het datum of datum-en-tijd is).

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

Dus het is prima, zolang beide argumenten van hetzelfde type zijn (ofwel tijd- of datetime-waarden).


  1. Hoe een deel van de string in orakel te verwijderen

  2. Voltooi het proces om de tabel van de ene database naar de andere te kopiëren (export-import) in SQL Server

  3. Logische replicatiepartitionering met PostgreSQL 13

  4. Controleer of er al een door de gebruiker gedefinieerd type bestaat in PostgreSQL