DATEADD 函数 - Amazon Redshift

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)

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

以下示例为 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 具有一个列 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

以下示例将 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

以下示例仅向 TIMESTAMP_TEST 中 2000 年之前的 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(month, 12,…) 或 dateadd(year, 1, …) 时,DATEADD 函数以不同方式处理闰年日期 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