DATEDIFF 函数
DATEDIFF 返回两个日期或时间表达式的日期部分之间的差异。
语法
DATEDIFF( datepart, {date|time|timetz|timestamp}, {date|time|timetz|timestamp} )
参数
- datepart
-
该函数运行所依据的日期或时间值的特定部分(年、月或日、小时、分钟、秒、毫秒或微秒)。有关更多信息,请参阅 日期或时间戳函数的日期部分。
具体而言,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|time|timetz|timestamp
-
DATE、TIME、TIMETZ 或 TIMESTAMP 列或隐式转换为 DATE、TIME、TIMETZ 或 TIMESTAMP 的表达式。表达式必须同时包含指定的日期或时间部分。如果第二个日期或时间晚于第一个日期或时间,则结果为正值。如果第二个日期或时间早于第一个日期或时间,则结果为负值。
返回类型
BIGINT
具有 DATE 列的示例
以下示例查找两个文本日期值之间的差异(以周数为单位)。
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_DIFF。
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 列的示例
下面的示例表 TIME_TEST 具有一个列 TIME_VAL(类型 TIME),其中插入了三个值。
select time_val from time_test; time_val --------------------- 20:00:00 00:00:00.5550 00:58:00
以下示例查找 TIME_VAL 列与时间文本之间的小时数差异。
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 列的示例
下面的示例表 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 文本与 timetz_val 之间的小时数差异。
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