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):MaxCompute 1.0 データ型エディションでは、値は暗黙的に
DATETIME型に変換されます。date_part パラメーターはサポートされています。MaxCompute 2.0 データ型エディションでは、暗黙的な変換と date_part パラメーターはサポートされていません。
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分
mi2番目
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 は日付関数です。日付の計算と変換に関する関数の詳細については、「日付関数」をご参照ください。