すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:DATEDIFF

最終更新日:Nov 13, 2025

DATEDIFF 関数は、終了日 end_date と開始日 start_date の間の時間差を計算します。この差は、date_part で指定された時間単位で測定されます。

構文

BIGINT | INT DATEDIFF(STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <end_date>, STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <start_date>[, STRING <date_part>])

-- 標準的な例。
-- 1 を返します。
SELECT DATEDIFF(DATE '2025-03-02', DATE '2025-03-01', 'dd');

パラメーター

  • end_date, start_date: 必須。日付またはタイムスタンプを指定します。サポートされているデータ型は、STRING、DATE、DATETIME、TIMESTAMP、および TIMESTAMP_NTZ です。

    入力が STRING の場合、関数の動作は特定の文字列フォーマットと MaxCompute データ型エディションによって異なります。

    • 入力文字列が DATE フォーマット (yyyy-mm-dd) の場合 (例: 2025-07-21)、date_part パラメーターは MaxCompute 1.0 と 2.0 の両方のデータ型エディションでサポートされていません。

    • 入力文字列が DATETIME フォーマット (yyyy-mm-dd hh:mi:ss) の場合 (例: 2025-07-21 00:00:00):

  • date_part: オプション。戻り値の時間単位を指定する STRING です。このパラメーターを指定しない場合、デフォルトの単位は日です。

    次の値がサポートされています:

    時間単位

    値

    年

    year または yyyy

    月

    month、mon、または mm

    週

    • week: 週は月曜日に始まります。これは week(monday) と同等です。

    • week(weekday): 週は指定された曜日 (weekday) に始まります。

      有効な値: SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、および SATURDAY。

    ISO 週

    isoweek は ISO 8601 で定義された週の境界を使用します。ISO 週は月曜日に始まります。

    日

    day または dd

    時

    hour または hh

    分

    mi

    2番目

    ss

    ミリ秒

    ff3

    マイクロ秒

    ff6

戻り値

BIGINT または INT 値を返します。次のルールが適用されます。

  • date_part が指定されている場合は BIGINT 値が返されます。date_part が指定されていない場合は INT 値が返されます。

  • end_date または start_date が STRING、DATE、DATETIME、TIMESTAMP、または TIMESTAMP_NTZ 値でない場合、エラーが返されます。

  • end_date が start_date より前の場合、負の値が返されます。

  • end_date、start_date、または date_part が NULL の場合、NULL が返されます。

  • 入力パラメーターが TIMESTAMP_NTZ 型でない場合、関数の計算メソッドは BigQuery 互換モードが有効になっているかどうかによって異なります:

    • デフォルト (BigQuery 互換モードが無効の場合) では、関数はまず値を date_part で指定された単位に切り捨ててから差を計算します。たとえば、DATE'25-01-01' と DATE'24-12-31' の差は 1 年または 1 か月です。

    • SET odps.sql.bigquery.compatible=true; コマンドを実行して BigQuery 互換モードを有効にする場合:

      • date_part が year、month、week、または isoweek の場合、関数はまず値を date_part で指定された単位に切り捨ててから差を計算します。たとえば、TIMESTAMP'25-01-01' と TIMESTAMP'24-12-31' の差は 1 年または 1 か月です。

      • date_part が day、hour、minute、second、millisecond、または microsecond の場合、関数はまず合計差を計算し、その結果を date_part で指定された単位に変換します。たとえば、TIMESTAMP'25-01-01 00:00:00' と TIMESTAMP'24-12-31 23:59:59' の差は 0 日または 0 時間です。

例

例 1: 基本的な例

  • 日単位の差を計算します。

    -- 1 を返します。
    SELECT DATEDIFF(DATE '2025-03-02', DATE '2025-03-01', 'dd');
  • 時間単位の差を計算します。

    -- 4 を返します。
    SELECT DATEDIFF(CAST('2023-10-26 14:00:00' AS DATETIME), CAST('2023-10-26 10:00:00' AS DATETIME), 'hh');
  • end_date が start_date より前の場合のマイクロ秒単位の差を計算します。

    -- -86400000000 を返します。
    SELECT DATEDIFF(DATE '2025-03-01', DATE '2025-03-02', 'ff6');
  • 週の開始を金曜日として、週単位の差を計算します。

    -- 13 を返します。
    SELECT DATEDIFF(DATETIME '2025-07-01 00:00:00', DATETIME '2025-03-28 01:30:09', 'week(friday)');
  • ISO 週単位の差を計算します。

    -- 20 を返します。
    SELECT DATEDIFF(TIMESTAMP_NTZ '2025-06-07 10:30:00.123', TIMESTAMP_NTZ '2025-01-15 00:30:45.123456', 'isoweek');

例 2: BigQuery 互換モードを有効にする前後の比較

-- 5 を返します。デフォルトモードでは、差が計算される前に値が切り捨てられます。
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi'  ) AS diff_in_minute1;

-- 4 を返します。BigQuery 互換モードでは、差が計算されてから指定された単位に変換されます。
SET odps.sql.bigquery.compatible=true;
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi'  ) AS diff_in_minute1;

例 3: 入力パラメーターが STRING 型の場合

入力 end_date と start_date が STRING 型の場合、関数の動作は特定の文字列フォーマットと MaxCompute データ型エディションによって異なります。

  • 入力文字列が DATE フォーマット (yyyy-mm-dd) の場合 (例: 2025-07-21)、date_part パラメーターは MaxCompute 1.0 と 2.0 の両方のデータ型エディションでサポートされていません。

    • MaxCompute 1.0 データ型エディションの場合:

      -- データ型エディションを V1.0 に設定します。
      SET odps.sql.type.system.odps2=false;
      SET odps.sql.hive.compatible=false;
      
      -- 不正な例: 入力パラメーターは yyyy-mm-dd フォーマットの STRING 型で、date_part パラメーターが指定されています。NULL が返されます。
      SELECT DATEDIFF('2025-07-01', '2025-06-28','day');
      
      -- 正しい例: 入力パラメーターは yyyy-mm-dd フォーマットの STRING 型で、date_part パラメーターは指定されていません。デフォルトの date_part は day です。
      SELECT DATEDIFF('2025-07-01', '2025-06-28');
      -- 次の結果が返されます。
      +------+
      | _c0  |
      +------+
      | 3    |
      +------+
    • MaxCompute 2.0 データ型エディションの場合:

      -- データ型エディションを V2.0 に設定します。
      SET odps.sql.type.system.odps2=true;
      
      -- 不正な例: 入力パラメーターは yyyy-mm-dd フォーマットの STRING 型で、date_part パラメーターが指定されています。エラーが返されます。
      SELECT DATEDIFF('2025-07-01', '2025-06-28','day');
      
      -- 正しい例: 入力パラメーターは yyyy-mm-dd フォーマットの STRING 型で、date_part パラメーターは指定されていません。デフォルトの date_part は day です。
      SELECT DATEDIFF('2025-07-01', '2025-06-28');
      -- 次の結果が返されます。
      +------+
      | _c0  |
      +------+
      | 3    |
      +------+
  • 入力文字列が DATETIME フォーマット (yyyy-mm-dd hh:mi:ss) の場合 (例: 2025-07-21 00:00:00):

    • MaxCompute 1.0 データ型エディションでは、値は計算のために暗黙的に DATETIME 型に変換されます。date_part パラメーターはサポートされています:

      -- データ型エディションを V1.0 に設定します。
      SET odps.sql.type.system.odps2=false;
      SET odps.sql.hive.compatible=false;
      
      -- 正しい例: 入力パラメーターは STRING 型で、DATETIME フォーマットに準拠しています。date_part パラメーターはサポートされています。
      SELECT DATEDIFF('2025-07-01 00:21:00', '2025-03-28 01:30:09', 'hour');
      -- 次の結果が返されます。
      +------------+
      | _c0        |
      +------------+
      | 2279       |
      +------------+
    • MaxCompute 2.0 データ型エディションでは、暗黙的な変換と date_part パラメーターはサポートされていません。デフォルトでは、差は計算されて日数で表されます:

      -- データ型エディションを V2.0 に設定します。
      SET odps.sql.type.system.odps2=true;
      SET odps.sql.hive.compatible=false;
      
      -- 不正な例: 入力パラメーターは STRING 型で DATETIME フォーマットに準拠していますが、date_part パラメーターが指定されています。エラーが返されます。
      SELECT DATEDIFF('2025-07-01 00:21:00', '2025-03-28 01:30:09', 'hour');
      
      -- 正しい例: 入力パラメーターは STRING 型で、date_part パラメーターは指定されていません。差はデフォルトで日数で計算されます。
      SELECT DATEDIFF('2025-07-01 00:21:00', '2025-03-28 01:30:09');
      -- 次の結果が返されます。
      +------------+
      | _c0        | 
      +------------+
      | 95         | 
      +------------+

関連関数

DATEDIFF は日付関数です。日付の計算と変換に関する関数の詳細については、「日付関数」をご参照ください。