この記事では、MySQLのTIMEDIFF()
の違いについて説明します。 およびTIMESTAMPDIFF()
機能。
どちらの関数も似たようなことをしますが、2つの間にいくつかの重要な違いがあります。
次の表は、これら2つの機能の違いをまとめたものです。
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
2つの引数が必要です。 | 3つの引数が必要です。 |
1番目から2番目の引数を減算します(date1 − date2)。 | 3番目(date2 − date1)から2番目の引数を減算します。 |
結果は時間値として表されます(時間データ型の制限があります)。 | 結果は整数であり、最初の引数で指定された単位の数で表されます。 |
時刻または日時の式を受け入れます。 | 日付または日時の式を受け入れます。 |
両方の引数は同じタイプ(時刻または日時)である必要があります。 | 両方の引数は異なるタイプ(日付または日時)にすることができます。 |
例1-基本的な違い
これらの機能の基本的な違いを示す例を次に示します。
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
結果:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
したがって、TIMEEDIFF()
であることがわかります。 時間値を返し、TIMESTAMPDIFF()
整数を返しました。
また、TIMEEDIFF()
TIMESTAMPDIFF()
で、1日から2日を減算しました。 2日目から1日目を引いた。
例2–単位の変更
前述のように、TIMESTAMPDIFF()
結果を表す単位を指定できます。いくつかの例を次に示します。
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';
結果:
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
ただし、実際の時差よりも大きい単位を使用すると、次のようになります。
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks', TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';
結果:
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
この場合、時差は週または月の値に影響を与えるほど大きくはありませんでした。
例3–間違った引数タイプ
各関数に間違った引数タイプを渡した場合の例を次に示します。
SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';
結果:
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
TIMEDIFF()
「日付」データ型をサポートしていないため、00:00:00
を返します。 。
そして、TIMESTAMPDIFF()
関数は「時間」データ型をサポートしていないため、NULL
を返します 。
例4–混合引数タイプ
各関数に2つの異なるデータ型を指定するとどうなりますか。
SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
結果:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
したがって、TIMESTAMPDIFF()
であることがわかります。 混合データ型を適切に処理します(日付または日時のいずれかである限り)。
ただし、TIMEDIFF()
両方の引数が同じタイプである必要があるため、NULL
を取得します 、両方の引数が関数がサポートするタイプ(時刻と日時)であっても。
次の例で、両方のタイプが実際にこの関数でサポートされていることを確認できます。
SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@thetime1, @thetime2) AS 'time', TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';
結果:
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+
したがって、両方の引数が同じタイプ(時刻または日時の値)である限り、問題ありません。