この記事では、2つのMySQL関数の違いについて説明します。 DATEDIFF()
およびTIMESTAMPDIFF()
。
どちらの関数も2つの日付や時刻の差を返しますが、結果は2つの関数で異なります。
次の表は、これら2つの機能の違いをまとめたものです。
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
2つの引数が必要です。 | 3つの引数が必要です。 |
1番目から2番目の引数を減算します(expr1 − expr2)。 | 3番目から2番目の引数を減算します(expr2 − expr1)。 |
結果は日数で表されます。 | 結果は、最初の引数によって提供される単位として表されます。 |
引数の日付値のみを比較できます。 | 引数の日付と時刻の値を比較できます。 |
例1-基本操作
これは、これらの関数がどのように機能し、同じユニットを使用した場合でも結果がどのように異なるかを示す例です。
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';
結果:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+
したがって、両方の関数は日数の差を返しますが、一方の結果は正で、もう一方の結果は負です。これは、DATEDIFF()
TIMESTAMPDIFF()
に対して、最初の日付から2番目の日付を減算します 2番目の日付から最初の日付を差し引きます。
例2–単位の変更
前の例が示すように、TIMESTAMPDIFF()
結果が返される単位を指定できます(実際には、必要 単位を指定します)。一方、DATEDIFF()
単位を指定することはできません。結果は数日で返されます。
したがって、前の例を変更して、TIMESTAMPDIFF()
日数ではなく時間数を返します:
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';
結果:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -24 | +----------+---------------+
マイクロ秒まで行くことができます:
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';
結果:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -86400000000 | +----------+---------------+
例3–精度
DATEDIFF()
の精度 は1日で、TIMESTAMPDIFF()
マイクロ秒まで下げることができます。ただし、TIMESTAMPDIFF()
の精度 (およびそれが比較する単位)は、指定された単位によって異なります。
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';
結果:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | 0 | 0 | 23 | 1439 | 86399 | 86399000000 | +----------+------+-------+---------+---------+--------------+
そして、2番目の日付を1秒インクリメントした場合の結果は次のとおりです(これにより翌日になります):
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';
結果:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | -1 | 1 | 24 | 1440 | 86400 | 86400000000 | +----------+------+-------+---------+---------+--------------+
別の例を次に示します。今回は、差が1か月(または31日)である月、四半期、および年を返すとどのように見えるかを確認します。
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';
結果:
+----------+------+-------+---------+------+ | DATEDIFF | Days | Month | Quarter | Year | +----------+------+-------+---------+------+ | -31 | 31 | 1 | 0 | 0 | +----------+------+-------+---------+------+
例4–間違った引数タイプ
間違った引数タイプが渡された場合、両方の関数はnullを返します。
SET @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
結果:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | NULL | +----------+---------------+
例5–混合引数タイプ
どちらの関数でも、1つの引数として日付を指定し、別の引数として日時を指定できます。
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
結果:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+