カテゴリ:

日付と時刻の関数

DATEDIFF

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

マイナス記号(-)を使って、ある日付から別の日付を差し引くことで、2つの日付の差を計算することもできます。

日付、時間、タイムスタンプに時間の単位を追加したり(例えば、日付に2日を追加する)、時間の単位を差し引いたりするには、 DATEADDTIMEADDTIMESTAMPADD 関数を使用します。

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

TIMEDIFF , TIMESTAMPDIFF

構文

DATEDIFF の場合:

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

マイナス記号の場合:

<date_expr2> - <date_expr1>
Copy

引数

DATEDIFF の場合:

date_or_time_part

時間の単位。 サポートされている日付と時刻の部分 (例えば、 month)にリストされている値のいずれかでなければなりません。値は文字列リテラルにすることも、引用符で囲まないようにすることもできます(例えば、 'month' または month)。

date_or_time_expr1date_or_time_expr2

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

マイナス記号の場合:

date_expr1date_expr2

比較する値。日付、または日付に評価できる式でなければなりません。値 date_expr1date_expr2 から減算されます。

戻り値

DATEDIFF の場合:

date_or_time_expr2date_or_time_expr1 の間の単位数(秒、日など)の差を表す整数を返します。

いずれかの引数が NULL の場合は NULL を返します。

マイナス記号の場合:

date_expr2date_expr1 の日数の差を表す整数を返します。(単位は常に日数です。)

date_expr2 または date_expr1 が NULL の場合、エラーを返します。

使用上の注意

DATEDIFF とマイナス記号の両方の場合:

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

DATEDIFF の場合:

  • 関数は、年、四半期、月、週、日、時間、分、秒、ミリ秒、マイクロ秒、ナノ秒の単位をサポートします。

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

  • 差の計算に使われる単位(例えば、 month)によって、 DATE、 TIME、 TIMESTAMP フィールドのどの部分が評価されるかが決まります。つまり、単位が結果の精度を決定します。

    小さい単位は使用されないため、値は丸められません。たとえば、2021年1月1日と2021年2月28日の差が、1か月よりも2か月に近い場合でも、次のように1か月が返されます。

    DATEDIFF(month, '2021-01-01'::DATE, '2021-02-28'::DATE)
    
    Copy

    DATE 値の場合:

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

    • month は、月と年を使用します。

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

    TIME 値の場合:

    • hour は、時のみを使用し、他のすべての部分を無視します。

    • minute は、時と分を使用します。

    • second は、時、分、秒を使用しますが、小数秒は使用しません。

    • millisecond は、時、分、秒、および小数秒の最初の3桁を使用します。小数秒は丸められません。たとえば、 DATEDIFF(milliseconds, '2024-02-20 21:18:41.0000', '2024-02-20 21:18:42.1239') は1.124秒ではなく、1.123秒を返します。

    • microsecond は、時、分、秒、および小数秒の最初の6桁を使用します。小数秒は丸められません。

    • nanosecond は、時、分、秒、および小数秒の9桁すべてを使用します。

    TIMESTAMP 値の場合:

    ルールは、上記の DATE および TIME データ型のルールと一致します。指定された単位以上の単位のみが使用されます。

マイナス記号の場合:

  • date_expr1date_expr2 は両方とも日付である必要があります。時間とタイムスタンプは許可されていません。

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

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

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

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

日付部分が 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');
Copy
+------------+------------+------------+-------------+-----------+---------------------+
| 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';
Copy
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);
Copy
+---------------------------+---------------------------+------------+--------------+--------------+
| 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 |
+---------------------------+---------------------------+------------+--------------+--------------+

指定したタイムスタンプと現在のタイムスタンプの年、月、日の差を計算するには、 CURRENT_TIMESTAMP 関数と DATEDIFF 関数を使用します。

SELECT column1 specified_timestamp,
       column2 timestamp_now,
       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
    ('2012-08-23 09:00:00.000 -0700', CURRENT_TIMESTAMP);
Copy
+-------------------------------+-------------------------------+------------+-------------+-----------+---------------------+
| SPECIFIED_TIMESTAMP           | TIMESTAMP_NOW                 | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|-------------------------------+-------------------------------+------------+-------------+-----------+---------------------|
| 2012-08-23 09:00:00.000 -0700 | 2024-09-04 17:21:12.189 -0700 |         12 |         145 |      4395 |                4395 |
+-------------------------------+-------------------------------+------------+-------------+-----------+---------------------+