DATEDIFF

以指定的间隔返回两个日期之间的时间跨度。 DATEDIFF 在其计算中不包括开始日期。

行为类型

  • 如果开始日期和结束日期为 TIMESTAMPDATETIMEINTERVAL,则是 不可变

  • 如果开始日期和结束日期为 TIMESTAMPTZ,则是 稳定

语法

DATEDIFF ( datepart, start, end );

参数

datepart
指定 DATEDIFF 返回的日期或时间间隔类型。如果 datepart 为表达式,则必须用括号括起来:
DATEDIFF((expression), start, end;

datepart 的求值结果必须为以下字符串字面量之一,无论带引号还是不带引号:

  • year | yy | yyyy

  • quarter | qq | q

  • month | mm | m

  • day | dayofyear | dd | d | dy | y

  • week | wk | ww

  • hour | hh

  • minute | mi | n

  • second | ss | s

  • millisecond | ms

  • microsecond | mcs | us

start, end
指定开始日期和结束日期,其中 startend 的求值结果为以下数据类型之一:

如果 end < start,则 DATEDIFF 返回负值。

兼容开始日期和结束日期数据类型

下表显示了可匹配为开始日期和结束日期的数据类型:

例如,如果将开始日期设置为 INTERVAL 数据类型,则结束日期也必须为 INTERVAL,否则 Vertica 将返回错误:

 SELECT DATEDIFF(day, INTERVAL '26 days', INTERVAL '1 month ');
 datediff
----------
        4
(1 row)

日期部分间隔

DATEDIFF 使用 datepart 实参计算两个日期之间的间隔数,而不是二者之间的实际时间量。 DATEDIFF 使用以下截止点计算这些间隔:

  • year:1 年 1 月

  • quarter:1 月 1 日、4 月 1 日、7 月 1 日、10 月 1 日

  • month:当月的第一天

  • week:周日午夜 (24:00)

例如,如果 datepart 设置为 year,则 DATEDIFF 使用 1 月 1 日计算两个日期之间的年数。以下 DATEDIFF 语句将 datepart 设置为 year,并将时间跨度指定为 2005 年 1 月 1 日到 2008 年 6 月 15 日:

SELECT DATEDIFF(year, '01-01-2005'::date, '12-31-2008'::date);
 datediff
----------
        3
(1 row)

DATEDIFF 在计算间隔时始终排除开始日期 — 在本例中为 2005 年 1 月 1。 DATEDIFF 计算过程中只考虑开始日历年,因此本例中只计算 2006、2007 和 2008 年。函数返回 3,尽管实际时间跨度接近四年。

如果将开始日期和结束日期分别更改为 2004 年 12 月 31 日和 2009 年 1 月 1 日,则 DATEDIFF 还会计算 2005 年和 2009 年。这一次,返回 5,尽管实际时间跨度刚刚超过四年:

=> SELECT DATEDIFF(year, '12-31-2004'::date, '01-01-2009'::date);
 datediff
----------
        5
(1 row)

同样,DATEDIFF 在计算两个日期之间的月数时使用月份开始日期。因此,在以下语句中,DATEDIFF 计算 2 月到 9 月之间的月份并返回 8:

=> SELECT DATEDIFF(month, '01-31-2005'::date, '09-30-2005'::date);
 datediff
----------
        8
(1 row)

另请参阅

TIMESTAMPDIFF