

 从补丁 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/)。

# DATEDIFF 函数
<a name="r_DATEDIFF_function"></a>

DATEDIFF 返回两个日期或时间表达式的日期部分之间的差异。

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

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

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

 *datepart*   
该函数运行所依据的日期或时间值的特定部分（年、月或日、小时、分钟、秒、毫秒或微秒）。有关更多信息，请参阅 [日期或时间戳函数的日期部分](r_Dateparts_for_datetime_functions.md)。  
具体而言，DATEDIFF 确定在两个表达式之间交叉的日期部分边界的数量。例如，假设您计算两个日期 `12-31-2008` 与 `01-01-2009` 之间的年份差异。在这种情况下，函数返回 1 年，尽管这些日期仅相隔一天。如果您发现两个时间戳 `01-01-2009 8:30:00` 与 `01-01-2009 10:00:00` 之间存在小时差，则结果为 2 小时。如果您发现两个时间戳 `8:30:00` 与 `10:00:00` 之间存在小时差，则结果为 2 小时。

*date*\$1*time*\$1*timetz*\$1*timestamp*  
DATE、TIME、TIMETZ 或 TIMESTAMP 列或隐式转换为 DATE、TIME、TIMETZ 或 TIMESTAMP 的表达式。表达式必须同时包含指定的日期或时间部分。如果第二个日期或时间晚于第一个日期或时间，则结果为正值。如果第二个日期或时间早于第一个日期或时间，则结果为负值。

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

BIGINT

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

以下示例查找两个文本日期值之间的差异（以周数为单位）。

```
select datediff(week,'2009-01-01','2009-12-31') as numweeks;

numweeks
----------
52
(1 row)
```

以下示例查找两个文本日期值之间的差异，以小时为单位。如果您没有为日期提供时间值，则默认为 00:00:00。

```
select datediff(hour, '2023-01-01', '2023-01-03 05:04:03');
            
date_diff
----------
53
(1 row)
```

以下示例查找两个文本 TIMESTAMETZ 值之间的差异，以天为单位。

```
Select datediff(days, 'Jun 1,2008  09:59:59 EST', 'Jul 4,2008  09:59:59 EST')
         
date_diff
----------
33
```

以下示例查找表中同一行的两个日期之间的差异，以天为单位。

```
select * from date_table;

start_date |   end_date
-----------+-----------
2009-01-01 | 2009-03-23
2023-01-04 | 2024-05-04
(2 rows)

select datediff(day, start_date, end_date) as duration from date_table;
         
duration
---------
      81
     486
(2 rows)
```

以下示例查找过去日期和今天日期中的文本值之间的差异（以季度数为单位）。此示例假定当前日期为 2008 年 6 月 5 日。您可以可以用全名或缩写来命名日期部分。DATEDIFF 函数的默认列名称为 DATE\$1DIFF。

```
select datediff(qtr, '1998-07-01', current_date);

date_diff
-----------
40
(1 row)
```

以下示例将 SALES 和 LISTING 表联接，以计算它们列出后多少天清单 1000 到 1005 的所有票证被售出。这些清单的最长销售等待时间为 15 天，最短等待时间不到一天（0 天）。

```
select priceperticket,
datediff(day, listtime, saletime) as wait
from sales, listing where sales.listid = listing.listid
and sales.listid between 1000 and 1005
order by wait desc, priceperticket desc;

priceperticket | wait
---------------+------
 96.00         |   15
 123.00        |   11
 131.00        |    9
 123.00        |    6
 129.00        |    4
 96.00         |    4
 96.00         |    0
(7 rows)
```

此示例计算卖家等待所有票证销售的平均小时数。

```
select avg(datediff(hours, listtime, saletime)) as avgwait
from sales, listing
where sales.listid = listing.listid;

avgwait
---------
465
(1 row)
```

## 具有 TIME 列的示例
<a name="r_DATEDIFF_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\$1VAL 列与时间文本之间的小时数差异。

```
select datediff(hour, time_val, time '15:24:45') from time_test;
         
 date_diff
-----------
        -5
        15
        15
```

以下示例查找两个文本时间值之间的分钟数差异。

```
select datediff(minute, time '20:00:00', time '21:00:00') as nummins;  
         
nummins 
---------- 
60
```

## 具有 TIMETZ 列的示例
<a name="r_DATEDIFF_function-examples-timetz"></a>

下面的示例表 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 文本与 timetz\$1val 之间的小时数差异。

```
select datediff(hours, timetz '20:00:00 PST', timetz_val) as numhours from timetz_test;

numhours 
---------- 
0
-4
1
```

以下示例查找两个文本 TIMETZ 值之间的小时数差异。

```
select datediff(hours, timetz '20:00:00 PST', timetz '00:58:00 EST') as numhours;
         
numhours 
---------- 
1
```