Database.Guide
On 1月 27, 2022 by adminこの記事では、2 つの MySQL 関数 DATEDIFF()
と TIMESTAMPDIFF()
の違いについて説明します。
両方の関数が 2 つの日付および/または時間の差を返しますが、2 つの関数で結果が異なります。
以下の表は、これら 2 つの関数の違いをまとめたものです:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
2つの引数を必要とする。 | 引数が3つ必要です。 |
第1引数から第2引数を引く(expr1 – expr2)。 | 第3引数から第2引数を引く(expr2 – expr1)。 |
結果は日単位で表現されます。 | 結果は第1引数で与えられた単位で表現されます。 |
その引数の日付値のみを比較できます。 | 引数の日付と時刻の値を比較できます。 |
例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()
が最初の日付から 2 番目の日付を引くのに対し、TIMESTAMPDIFF()
は 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';
Result:
+----------+---------------+| 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';
Result:
+----------+------+-------+---------+---------+--------------+| 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';
Result.Of.1
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
Result.Of.2
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';
Result.Of.1 Result.For.1
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
別の例を示します。今度は、差が1カ月(または31日)である場合に、月、四半期、年を返すとどのように見えるかを見てみましょう。
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Result:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Example 5 – Mixed Argument Types
Both functions allows you to provide a date as one argument and a datetime as another 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';
Result:
<8042>の2つの関数は引数の型が異なっています。
コメントを残す