Database.Guide
On 27 tammikuun, 2022 by adminTässä artikkelissa tarkastellaan kahden MySQL-funktion eroa; DATEDIFF()
ja TIMESTAMPDIFF()
.
Kummatkin funktiot palauttavat kahden päivämäärän ja/tai kellonajan välisen erotuksen, mutta tulos on erilainen näiden kahden funktion välillä.
Seuraavassa taulukossa on yhteenveto näiden kahden funktion eroista:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Tarvitsee 2 argumenttia. | Tarvitsee 3 argumenttia. |
Muuttaa 2. argumentin 1. argumentista (expr1 – expr2). | Muuttaa 2. argumentin 3. argumentista (expr2 – expr1). |
Tulos ilmaistaan arvona päivinä. | Tulos ilmaistaan ensimmäisen argumentin antamana yksikkönä. |
Voi verrata vain argumenttiensa päivämäärän arvoa. | Voi verrata argumenttiensa päivämäärän ja kellonajan arvoa. |
Esimerkki 1 – Perusoperaatio
Tässä on esimerkki, joka havainnollistaa, miten nämä funktiot toimivat ja miten tulokset eroavat toisistaan, vaikka käytettäisiin samaa yksikköä.
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';
Tulos:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Kummatkin funktiot palauttavat siis päivien erotuksen, mutta toinen tulos on positiivinen ja toinen negatiivinen. Tämä johtuu siitä, että DATEDIFF()
vähentää toisen päivämäärän ensimmäisestä, kun taas TIMESTAMPDIFF()
vähentää ensimmäisen päivämäärän toisesta.
Esimerkki 2 – Yksikön muuttaminen
Kuten edellinen esimerkki osoittaa, TIMESTAMPDIFF()
:n avulla voit määritellä yksikön, jolla tulokset palautetaan (itse asiassa se edellyttää yksikön määrittämistä). Toisaalta DATEDIFF()
ei anna sinun määrittää yksikköä. Se palauttaa tuloksen vain päivinä.
Voisimme siis muuttaa edellistä esimerkkiä niin, että TIMESTAMPDIFF()
palauttaa tuntien määrän päivien sijaan:
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';
Tulos:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
Tulos:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
Voit edetä mikrosekuntiin asti:
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';
Tulos:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Esimerkki 3 – Tarkkuus
Tarkkuus DATEDIFF()
on yksi päivä, ja TIMESTAMPDIFF()
voi mennä mikrosekuntiin asti. TIMESTAMPDIFF()
:n tarkkuus (ja yksikkö, jota se vertaa) riippuu kuitenkin edelleen määritetystä yksiköstä.
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';
Tulos:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
Ja tässä on tulos, jos kasvatamme 2. päivämäärää yhdellä sekunnilla (mikä tuo sen seuraavaan päivään):
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';
Tulos:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
Tässä on toinen esimerkki, tällä kertaa katsotaan, miltä näyttää, kun palautamme kuukausia, neljännesvuosia ja vuosia, kun ero on yksi kuukausi (tai 31 päivää):
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';
Tulos:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
Esimerkki 4 – Väärät argumenttityypit
Kummatkin funktiot palauttavat nollatuloksen, jos niille välitetään väärä argumenttityyppi.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Tulos:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Esimerkki 5 – Sekalaiset argumenttityypit
Kummassakin funktiossa voit antaa yhtenä argumenttina päivämäärän ja toisena datetime-argumenttina datan.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00';SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Tulos:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Vastaa