MySQLに含まれる2つの日付関数はDATEDIFF()
です。 およびTIMEDIFF()
。
どちらの関数も似たようなことをしますが、いくつかの意味のある違いがあります。
次の表は、これら2つの機能の違いをまとめたものです。
DATEDIFF() | TIMEDIFF() |
---|---|
結果は日数で表されます。 | 結果は時間値として表されます。 |
引数の日付値のみを比較します。 | 引数の時間値を比較します。 |
日付または日時の式を受け入れます。 | 時刻または日付と時刻の式を受け入れます。 |
どちらの引数も異なるタイプ(日付または日時)にすることができます。 | 両方の引数は同じタイプ(時刻または日時)である必要があります。 |
例1-基本的な違い
これらの機能の基本的な違いを示す例を次に示します。
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
結果:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 24:00:00 | +----------+----------+
したがって、DATEDIFF()
返された1
、「1日」を意味し、TIMEDIFF()
返された24:00:00
これは正確に1日の時間表現です。
例2–時間値の指定
変数の1つの時間値を増やすとどうなるか見てみましょう。
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
結果:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 36:15:35 | +----------+----------+
したがって、DATEDIFF()
前の例と同じ結果を返します。これは、日付値のみを比較するためです(時間値は無視されます)。
TIMEDIFF()
一方、関数は時間を比較するため、より正確な結果を返します。これは、2つの日付と時刻の値の間に36時間、15分、および35秒があることを示しています。
例3–間違った引数タイプ
各関数に間違った引数タイプを渡した場合の例を次に示します。
SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF Date', DATEDIFF(@time1, @time2) AS 'DATEDIFF Time', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';
結果:
+---------------+---------------+---------------+---------------+ | DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time | +---------------+---------------+---------------+---------------+ | 1 | NULL | 00:00:00 | 12:15:35 | +---------------+---------------+---------------+---------------+
正しい引数タイプが渡されたため、最初と最後の結果は問題ありません。ただし、真ん中の2つの結果には間違ったデータ型が渡されたため、正しい結果を計算できませんでした。
例4–混合引数タイプ
各関数に2つの異なるデータ型を指定するとどうなりますか。
SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';
結果:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | NULL | +----------+----------+
したがって、DATEDIFF()
混合データ型を適切に処理します(日付または日時のいずれかである限り)。
ただし、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 | +----------+----------+