カテゴリ:

日付と時刻の関数

DATEDIFF

要求された日付または時刻の部分に基づいて、2つの日付、時刻、またはタイムスタンプ式の差を計算します。この関数は、3番目の引数から2番目の引数を減算した結果を返します。

マイナス記号(「-」)を使用して日付を減算することもできます。

こちらもご参照ください:

TIMEDIFF , TIMESTAMPDIFF

構文

DATEDIFFの構文

DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )

マイナス記号の構文

<date_or_time_expr2> - <date_or_time_expr1>

引数

  • 日付または時刻部分 は、 サポートされている日付と時刻の部分 にリストされている値のいずれかでなければなりません。

  • 日付または時刻式1日付または時刻式2 は、日付、時刻、タイムスタンプであるか、日付、時刻、またはタイムスタンプを評価できる式でなければなりません。値 日付または時刻式1日付または時刻式2 から減算されます。

戻り値

日付または時刻式1日付または時刻式2 の単位(秒、日など)の差を表す整数を返します。

マイナス記号を使用した日付の減算の場合、単位は常に日です。

使用上の注意

  • 値は、-12日などの負の値にすることができます。

DATEDIFFの場合

  • DATEDIFF は、年、四半期、月、週、日、時間、分、秒をサポートします。

  • 日付または時刻部分 は、 サポートされている日付と時刻の部分 にリストされている値のいずれかでなければなりません。

    日付または時刻部分week (またはそのバリエーション)である場合、出力は WEEK_START セッションパラメーターによって制御されます。例などの詳細については、 カレンダーの週と平日 をご参照ください。

  • 日付または時刻式1 および 日付または時刻式2 は、日付、時刻、またはタイムスタンプにすることができます。

  • 差の計算に使用される単位が日付部分( yearmonthday など)または時間部分( hourminutesecond など)の場合、関連する部分のみ使用されます。

    例:

    • year は、日付から年のみを使用し、他のすべての部分を無視します。

    • month は、日付から月と年を使用します。

    • day は、日付全体を使用します。

    • hour は、時間/タイムスタンプの時間のみを使用し、他のすべての部分を無視します。

    • minute は、時間/タイムスタンプの時間と分を使用します。

    • second は、時間/タイムスタンプ全体を使用します。

    詳細については、以下をご参照ください。

マイナス記号の場合

  • 日付または時刻式1日付または時刻式2 は両方とも日付でなければなりません。

2つのタイムスタンプの年の差を計算します。

SELECT DATEDIFF(year, '2010-04-09 14:39:20'::TIMESTAMP, 
                      '2013-05-08 23:39:20'::TIMESTAMP) 
               AS diff_years;
+------------+
| DIFF_YEARS |
|------------|
|          3 |
+------------+

2つのタイムスタンプの時間の差を計算します。

SELECT DATEDIFF(hour, '2013-05-08T23:39:20.123-07:00'::TIMESTAMP, 
    DATEADD(year, 2, ('2013-05-08T23:39:20.123-07:00')::TIMESTAMP)) 
               AS diff_hours;
+------------+
| DIFF_HOURS |
|------------|
|      17520 |
+------------+

日付部分が DATEDIFF 計算にどのように影響するかを示します。また、日付の減算にマイナス記号を使用する方法を示します。

SELECT column1 date_1, column2 date_2,
      DATEDIFF(year, column1, column2) diff_years,
      DATEDIFF(month, column1, column2) diff_months,
      DATEDIFF(day, column1, column2) diff_days,
      column2::DATE - column1::DATE AS diff_days_via_minus
    FROM VALUES
      ('2015-12-30', '2015-12-31'),
      ('2015-12-31', '2016-01-01'),
      ('2016-01-01', '2017-12-31'),
      ('2016-08-23', '2016-09-07');
+------------+------------+------------+-------------+-----------+---------------------+
| DATE_1     | DATE_2     | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|------------+------------+------------+-------------+-----------+---------------------|
| 2015-12-30 | 2015-12-31 |          0 |           0 |         1 |                   1 |
| 2015-12-31 | 2016-01-01 |          1 |           1 |         1 |                   1 |
| 2016-01-01 | 2017-12-31 |          1 |          23 |       730 |                 730 |
| 2016-08-23 | 2016-09-07 |          0 |           1 |        15 |                  15 |
+------------+------------+------------+-------------+-----------+---------------------+

時間部分が DATEDIFF の計算にどのように影響するかを示します。

ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'DY, DD MON YYYY HH24:MI:SS';
SELECT column1 timestamp_1, column2 timestamp_2,
      DATEDIFF(hour, column1, column2) diff_hours,
      DATEDIFF(minute, column1, column2) diff_minutes,
      DATEDIFF(second, column1, column2) diff_seconds
    FROM VALUES
      ('2016-01-01 01:59:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP),
      ('2016-01-01 01:00:00'::TIMESTAMP, '2016-01-01 01:59:00'::TIMESTAMP),
      ('2016-01-01 01:00:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP);
+---------------------------+---------------------------+------------+--------------+--------------+
| TIMESTAMP_1               | TIMESTAMP_2               | DIFF_HOURS | DIFF_MINUTES | DIFF_SECONDS |
|---------------------------+---------------------------+------------+--------------+--------------|
| Fri, 01 Jan 2016 01:59:59 | Fri, 01 Jan 2016 02:00:00 |          1 |            1 |            1 |
| Fri, 01 Jan 2016 01:00:00 | Fri, 01 Jan 2016 01:59:00 |          0 |           59 |         3540 |
| Fri, 01 Jan 2016 01:00:59 | Fri, 01 Jan 2016 02:00:00 |          1 |           60 |         3541 |
+---------------------------+---------------------------+------------+--------------+--------------+