DATEADD 関数
指定された間隔で DATE、TIME、TIMETZ、または TIMESTAMP の値を増分します。
構文
DATEADD( datepart, interval, {date|time|timetz|timestamp} )
引数
- datepart
-
関数が実行される日付部分 (例: 年、月、日、または時間)。詳細については、「日付関数またはタイムスタンプ関数の日付部分」を参照してください。
- interval
-
ターゲット式に追加する間隔 ( 日数など ) を指定する整数。負の整数は間隔を減算します。
- date|time|timetz|timestamp
-
DATE、TIME、TIMETZ、または TIMESTAMP の列、あるいは暗黙的に DATE、TIME、TIMETZ、または TIMESTAMP に変換される式。DATE、TIME、TIMETZ、または TIMESTAMP の式には、指定した日付部分が含まれている必要があります。
戻り型
入力データ型に応じて TIMESTAMP、TIME、または TIMETZ を指定します。
DATE 列の例
次の例では、DATE テーブルに存在する 11 月の各日付に 30 日追加します。
select dateadd(day,30,caldate) as novplus30 from date where month='NOV' order by dateid; novplus30 --------------------- 2008-12-01 00:00:00 2008-12-02 00:00:00 2008-12-03 00:00:00 ... (30 rows)
次の例は、リテラル日付値に 18 か月を追加します。
select dateadd(month,18,'2008-02-28'); date_add --------------------- 2009-08-28 00:00:00 (1 row)
DATEDIFF 関数のデフォルトの列名は DATE_ADD です。日付の値に使用するデフォルトのタイムスタンプは 00:00:00
です。
次の例では、タイムスタンプを指定しない日付の値に 30 分を追加します。
select dateadd(m,30,'2008-02-28'); date_add --------------------- 2008-02-28 00:30:00 (1 row)
完全名または略名で日付部分に名前を付けることができます。この場合、m は月ではなく分を表します。
TIME 列の例
次のテーブルの TIME_TEST の例には、3 つの値が挿入された列 TIME_VAL (タイプ TIME) があります。
select time_val from time_test; time_val --------------------- 20:00:00 00:00:00.5550 00:58:00
次の例では、TIME_TEST テーブルの各 TIME_VAL に 5 分を追加します。
select dateadd(minute,5,time_val) as minplus5 from time_test; minplus5 --------------- 20:05:00 00:05:00.5550 01:03:00
次の例では、リテラル時刻値に 8 時間を追加します。
select dateadd(hour, 8, time '13:24:55'); date_add --------------- 21:24:55
次の例では、時刻が 24:00:00 を超えるか 00:00:00 を下回る場合を示しています。
select dateadd(hour, 12, time '13:24:55'); date_add --------------- 01:24:55
TIMETZ 列の例
これらの例の出力値は、デフォルトのタイムゾーンである UTC です。
次のテーブルの TIMETZ_TEST の例には、3 つの値が挿入された列 TIMETZ_VAL (タイプ TIMETZ) があります。
select timetz_val from timetz_test; timetz_val ------------------ 04:00:00+00 00:00:00.5550+00 05:58:00+00
次の例では、TIMETZ_TEST テーブルの各 TIMETZ_VAL に 5 分を追加します。
select dateadd(minute,5,timetz_val) as minplus5_tz from timetz_test; minplus5_tz --------------- 04:05:00+00 00:05:00.5550+00 06:03:00+00
次の例では、リテラルの timetz 値に 2 時間を追加します。
select dateadd(hour, 2, timetz '13:24:55 PST'); date_add --------------- 23:24:55+00
TIMESTAMP 列の例
これらの例の出力値は、デフォルトのタイムゾーンである UTC です。
次のテーブルの TIMESTAMP_TEST の例には、3 つの値が挿入された列 TIMESTAMP_VAL (タイプ TIMESTAMP) があります。
SELECT timestamp_val FROM timestamp_test; timestamp_val ------------------ 1988-05-15 10:23:31 2021-03-18 17:20:41 2023-06-02 18:11:12
次の例では、2000 年より前の TIMESTAMP_TEST の TIMESTAMP_VAL 値にのみ 20 年を加算しています。
SELECT dateadd(year,20,timestamp_val) FROM timestamp_test WHERE timestamp_val < to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH:MI:SS'); date_add --------------- 2008-05-15 10:23:31
次の例では、秒インジケータなしで書き込まれたリテラルタイムスタンプ値に 5 秒を加算します。
SELECT dateadd(second, 5, timestamp '2001-06-06'); date_add --------------- 2001-06-06 00:00:05
使用に関する注意事項
DATEADD(month, ...) および ADD_MONTHS 関数は、異なる月末になる日付を処理します。
-
ADD_MONTHS: 追加している日付が月の最終日である場合、結果は月の期間にかかわらず、常に結果の月の最終日になります。例えば、4 月 30 日 + 1 か月は 5 月 31 日になります。
select add_months('2008-04-30',1); add_months --------------------- 2008-05-31 00:00:00 (1 row)
-
DATEADD: 追加している日付が結果の月より短い場合、結果は月の最終日ではなく、結果の月の対応する日付になります。例えば、4 月 30 日 + 1 か月は 5 月 30 日になります。
select dateadd(month,1,'2008-04-30'); date_add --------------------- 2008-05-30 00:00:00 (1 row)
DATEADD 関数では dateadd(month, 12,…) または dateadd(year, 1, …) を使用するとき、うるう年の日付 02-29 は扱いが異なります。
select dateadd(month,12,'2016-02-29'); date_add --------------------- 2017-02-28 00:00:00 select dateadd(year, 1, '2016-02-29'); date_add --------------------- 2017-03-01 00:00:00