Database.Guide
On január 27, 2022 by adminEz a cikk két MySQL függvény közötti különbséget vizsgálja; DATEDIFF()
és TIMESTAMPDIFF()
.
Mindkét függvény két dátum és/vagy időpont közötti különbséget ad vissza, de az eredmény a két függvény között eltérő.
A következő táblázat összefoglalja a két függvény közötti különbséget:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
2 argumentumot igényel. | 3 argumentumot igényel. |
A 2. argumentumot kivonja az 1. argumentumból (expr1 – expr2). | A 2. argumentumot kivonja a 3. argumentumból (expr2 – expr1). |
Az eredményt napokban kifejezett értékként fejezi ki. | Az eredményt az első argumentum által megadott egységben fejezi ki. |
Csak az argumentumok dátumértékét tudja összehasonlítani. | Az argumentumok dátum- és időértékét tudja összehasonlítani. |
Példa 1 – Alapművelet
Itt egy példa, amely bemutatja, hogyan működnek ezek a függvények, és hogyan különböznek az eredmények, még akkor is, ha ugyanazt az egységet használják.
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';
Eredmény:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Azaz mindkét függvény a napok különbségét adja vissza, azonban az egyik eredmény pozitív, a másik negatív. Ennek az az oka, hogy a DATEDIFF()
a második dátumot vonja ki az elsőből, míg a TIMESTAMPDIFF()
az első dátumot vonja ki a másodikból.
2. példa – Az egység megváltoztatása
Amint az előző példa is mutatja, a TIMESTAMPDIFF()
lehetővé teszi, hogy megadjuk az egységet, amelyben az eredményeket visszaadjuk (sőt, meg is követeli az egység megadását). Ezzel szemben a DATEDIFF()
nem teszi lehetővé egység megadását. Csak napokban adja vissza az eredményt.
Az előző példát tehát úgy módosíthatjuk, hogy a TIMESTAMPDIFF()
napok helyett az órák számát adja vissza:
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';
Eredmény:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
Elmehetünk egészen a mikroszekundumokig:
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';
Eredmény:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Példa 3 – Precizitás
A DATEDIFF()
pontossága egy nap, a TIMESTAMPDIFF()
pedig a mikroszekundumig mehet le. A TIMESTAMPDIFF()
pontossága (és az általa összehasonlított egység) azonban még mindig a megadott egységtől függ.
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';
Eredmény:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
És itt az eredmény, ha a 2. dátumot egy másodperccel növeljük (ami a következő napra hozza):
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';
Eredmény:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
Itt egy másik példa, ezúttal megnézzük, hogyan néz ki, ha hónapokat, negyedéveket és éveket adunk vissza, amikor a különbség egy hónap (vagy 31 nap):
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';
Eredmény:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
4. példa – Rossz argumentumtípusok
Mindkét függvény nullát ad vissza, ha rossz argumentumtípust adunk át.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Eredmény:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
5. példa – Vegyes argumentumtípusok
Mindkét függvény lehetővé teszi, hogy egyik argumentumként dátumot, másik argumentumként pedig dátumidőt adjunk meg.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00';SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Eredmény:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Vélemény, hozzászólás?