

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# DATEADD 函数
<a name="r_DATEADD_function"></a>

按指定的时间间隔递增 DATE、TIME、TIMETZ 或 TIMESTAMP 值。

## 语法
<a name="r_DATEADD_function-synopsis"></a>

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

## 参数
<a name="r_DATEADD_function-arguments"></a>

 *datepart*   
函数操作的日期部分（例如年、月、日或小时）。有关更多信息，请参阅 [日期或时间戳函数的日期部分](r_Dateparts_for_datetime_functions.md)。

 *interval*   
指定要添加到目标表达式的时间间隔（例如天数）的整数。负整数减去时间间隔。

 *date*\$1*time*\$1*timetz*\$1*timestamp*  
DATE、TIME、TIMETZ 或 TIMESTAMP 列或隐式转换为 DATE、TIME、TIMETZ 或 TIMESTAMP 的表达式。DATE、TIME、TIMETZ 或 TIMESTAMP 表达式必须包含指定的日期部分。

## 返回类型
<a name="r_DATEADD_function-return-type"></a>

TIMESTAMP 或 TIME 或 TIMETZ，具体取决于输入数据类型。

## 具有 DATE 列的示例
<a name="r_DATEADD_function-examples"></a>

以下示例为 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\$1ADD。日期值的默认时间戳为 `00:00:00`。

以下示例向未指定时间戳的日期值添加 30 分钟。

```
select dateadd(m,30,'2008-02-28');

date_add
---------------------
2008-02-28 00:30:00
(1 row)
```

您可以用全名或缩写来命名日期部分。在此情况下，*m* 代表几分钟，而不是几个月。

## 具有 TIME 列的示例
<a name="r_DATEADD_function-examples-time"></a>

下面的示例表 TIME\$1TEST 具有一个列 TIME\$1VAL（类型 TIME），其中插入了三个值。

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

以下示例为 TIME\$1TEST 表中的每个 TIME\$1VAL 添加 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 列的示例
<a name="r_DATEADD_function-examples-timetz"></a>

这些示例中的输出值以 UTC 为默认时区。

下面的示例表 TIMETZ\$1TEST 具有一个列 TIMETZ\$1VAL（类型 TIMETZ），其中插入了三个值。

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

下面的示例为 TIMETZ\$1TEST 表中的每个 TIMETZ\$1VAL 添加 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 列的示例
<a name="r_DATEADD_function-examples-timestamp"></a>

这些示例中的输出值以 UTC 为默认时区。

下面的示例表 TIMESTAMP\$1TEST 具有一个列 TIMESTAMP\$1VAL（类型为 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\$1TEST 中 2000 年之前的 TIMESTAMP\$1VAL 值增加 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
```

## 使用说明
<a name="r_DATEADD_usage_notes"></a>

 DATEADD(month, ...) 和 ADD\$1MONTHS 函数以不同的方式处理位于月末的日期：
+ ADD\$1MONTHS：如果添加到的日期是该月的最后一天，则无论该月有多少天，结果始终是结果月份的最后一天。例如，4 月 30 日 \$1 1 个月是 5 月 31 日。

  ```
  select add_months('2008-04-30',1);
  
  add_months
  ---------------------
  2008-05-31 00:00:00
  (1 row)
  ```
+ DATEADD：如果添加到的日期中的天数少于结果月份，则结果是结果月份的对应日期，而不是该月的最后一天。例如，4 月 30 日 \$1 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
```