Database.Guide
On ianuarie 27, 2022 by adminAcest articol analizează diferența dintre două funcții MySQL; DATEDIFF()
și TIMESTAMPDIFF()
.
Ambele funcții returnează diferența dintre două date și/sau ore, dar rezultatul este diferit între cele două funcții.
Tabelul următor rezumă diferența dintre aceste două funcții:
DATEDIFF() |
TIMESTAMPDIFF() |
|
---|---|---|
Cercetează 2 argumente. | Cerce 3 argumente. | |
Subțiază al doilea argument din primul (expr1 – expr2). | Subțiază al doilea argument din al treilea (expr2 – expr1). | Subțiază al doilea argument din al treilea (expr2 – expr1). |
Rezultatul este exprimat ca o valoare în zile. | Rezultatul este exprimat în unitatea furnizată de primul argument. | |
Poate compara numai valoarea de dată a argumentelor sale. | Poate compara valoarea de dată și oră a argumentelor sale. |
Exemplu 1 – Operație de bază
Iată un exemplu care demonstrează cum funcționează aceste funcții și cum rezultatele sunt diferite, chiar dacă se folosește aceeași unitate.
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';
Rezultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Ambele funcții returnează deci diferența în zile, însă un rezultat este pozitiv și celălalt negativ. Acest lucru se datorează faptului că DATEDIFF()
scade a doua dată din prima, în timp ce TIMESTAMPDIFF()
scade prima dată din a doua.
Exemplu 2 – Schimbarea unității
După cum demonstrează exemplul anterior, funcția TIMESTAMPDIFF()
vă permite să specificați o unitate pentru ca rezultatele să fie returnate ca (de fapt, vă cere să specificați unitatea). Pe de altă parte, DATEDIFF()
nu vă permite să specificați o unitate. Acesta returnează rezultatul doar în zile.
Așa că am putea modifica exemplul anterior astfel încât TIMESTAMPDIFF()
să returneze numărul de ore în loc de zile:
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';
Rezultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
Se poate merge până la microsecunde:
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';
Rezultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Exemplu 3 – Precizie
Precizia lui DATEDIFF()
este de o zi, iar TIMESTAMPDIFF()
poate merge până la microsecundă. Cu toate acestea, precizia lui TIMESTAMPDIFF()
(și unitatea pe care o compară) depinde în continuare de unitatea specificată.
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';
Rezultat:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
Și iată rezultatul dacă creștem a 2-a dată cu o secundă (ceea ce o aduce la ziua următoare):
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';
Rezultat:
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';
Rezultat:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
Iată un alt exemplu, de data aceasta văzând cum arată când returnăm luni, trimestre și ani atunci când diferența este de o lună (sau 31 de zile):
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';
Rezultat:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
Exemplu 4 – Tipuri de argumente greșite
Ambele funcții returnează null dacă li se trece tipul de argument greșit.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Rezultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Exemplu 5 – Tipuri de argumente amestecate
Ambele funcții vă permit să furnizați o dată ca un argument și un datatime ca un alt 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';
Rezultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Lasă un răspuns