DATEADD 函數 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

DATEADD 函數

透過指定間隔來增量 DATE、TIME、TIMETZ 或 TIMESTAMP 值。

語法

DATEADD( datepart, interval, {date|time|timetz|timestamp} )

引數

datepart

函數對其執行的日期部分 (例如,年、月、日或小時)。如需詳細資訊,請參閱 日期或時間戳記函數的日期部分

間隔

指定要新增至目標表達式之間隔 (例如,天數) 的整數。負整數會減去間隔。

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)

DATEADD 函數的預設欄名稱為 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 有一個 TIME_VAL 欄 (類型為 TIME),其中插入了三個值。

select time_val from time_test; time_val --------------------- 20:00:00 00:00:00.5550 00:58:00

下列範例會將 5 分鐘增加至 TIME_TEST 資料表中的每個 TIME_VAL。

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

具有 TIMTZ 欄的範例

這些範例中的輸出值是以 UTC 為預設時區。

下列範例資料表 TIMETZ_TEST 有一個 TIMETZ_VAL 欄 (類型為 TIMETZ),其中插入了三個值。

select timetz_val from timetz_test; timetz_val ------------------ 04:00:00+00 00:00:00.5550+00 05:58:00+00

下列範例會將 5 分鐘增加至 TIMETZ_TEST 資料表中的每個 TIMETZ_VAL。

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

下列範例會將 2 小時加入常值 timetz 值。

select dateadd(hour, 2, timetz '13:24:55 PST'); date_add --------------- 23:24:55+00

具有 TIMESTAMP 欄的範例

這些範例中的輸出值是以 UTC 為預設時區。

下列範例資料表 TIMESTAMP_TEST 有一個 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

以下範例僅將 20 年增加至 2000 年之前的 TIMESTAMP_TEST 中的 TIMESTAMP_VAL 值。

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 (月份,12…) 或 dateadd (年份,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