类别:

日期和时间函数

DATEDIFF

根据请求的日期或时间部分计算两个日期、时间或时间戳表达式之间的差异。该函数返回从第三个实参中减去第二个实参的结果。

减号 (-) 也可用于减去日期。

另请参阅:

TIMEDIFFTIMESTAMPDIFF

语法

对于 DATEDIFF:

DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )
Copy

对于减号:

<date_expr2> - <date_expr1>
Copy

实参

对于 DATEDIFF:

date_or_time_part

时间单位。必须是 支持的日期和时间部分 中列出的一个值(例如 month)。该值可以是字符串字面量,也可以不带引号(例如 'month'month)。

date_or_time_expr1date_or_time_expr2

要比较的值。必须是日期、时间、时间戳或计算结果为日期、时间或时间戳的表达式。从 date_or_time_expr2 中减去 date_or_time_expr1 值。

对于减号:

date_expr1date_expr2

要比较的值。必须是日期,或者计算结果为日期的表达式。从 date_expr2 中减去 date_expr1 值。

返回

对于 DATEDIFF:

返回一个整数,表示 date_or_time_expr2date_or_time_expr1 之间的单位数(秒、天等)差值。

对于减号:

返回一个整数,表示 date_expr2date_expr1 之间的天数差。(单位始终为天。)

使用说明

对于 DATEDIFF 和减号:

  • 输出值可以是负数,例如 -12 天。

对于 DATEDIFF:

  • date_or_time_expr1date_or_time_expr2 可以是日期、时间或时间戳。

  • 此函数支持年、季度、月、周、日、小时、分钟、秒、毫秒、微秒和纳秒的单位。

  • date_or_time_part 必须是 支持的日期和时间部分 中列出的值之一。

    如果 date_or_time_partweek`(或其任何变体),则输出由 :ref:`label-week_start 会话参数所控制。有关更多详细信息(包括示例),请参阅 日历周和工作日

  • 用于计算差值的单位(例如 month)确定了 DATE、TIME 或 TIMESTAMP 字段的哪些部分用于确定结果,从而确定了结果的精度。

    不使用较小的单位,因此值不会四舍五入。例如,即使 2021 年 1 月 1 日和 2021 年 2 月 28 日之间的差值接近两个月而不是一个月,但以下查询返回一个月:

    DATEDIFF(month, '2021-01-01'::DATE, '2021-02-28'::DATE)
    
    Copy

    对于 DATE 值:

    • year 仅使用年份,而忽略所有其他部分。

    • month 使用月份和年份。

    • day 使用整个日期。

    对于 TIME 值:

    • hour 仅使用小时,而忽略所有其他部分。

    • minute 使用小时和分钟。

    • second 使用小时、分钟和秒,但不使用小数秒。

    • millisecond 使用小时、分钟、秒和小数秒的前三位数字。小数秒数不四舍五入。例如,DATEDIFF(milliseconds, '2024-02-20 21:18:41.0000', '2024-02-20 21:18:42.1239') 返回 1.123 秒,而不是 1.124 秒。

    • microsecond 使用小时、分钟、秒和小数秒的前六位数字。小数秒数不四舍五入。

    • nanosecond 使用小时、分钟、秒和小数秒的所有九位数字。

    对于 TIMESTAMP 值:

    这些规则与上述 DATE 和 TIME 数据类型的规则相匹配。仅使用指定的单位和较大单位。

对于减号:

  • date_expr1date_expr2 都必须是日期。不允许是时间和时间戳。

示例

计算两个时间戳之间的年差:

SELECT DATEDIFF(year, 
                '2020-04-09 14:39:20'::TIMESTAMP, 
                '2023-05-08 23:39:20'::TIMESTAMP) 
  AS diff_years;
Copy
+------------+
| DIFF_YEARS |
|------------|
|          3 |
+------------+

计算两个时间戳之间的小时差:

SELECT DATEDIFF(hour, 
               '2023-05-08T23:39:20.123-07:00'::TIMESTAMP, 
               DATEADD(year, 2, ('2023-05-08T23:39:20.123-07:00')::TIMESTAMP)) 
  AS diff_hours;
Copy
+------------+
| DIFF_HOURS |
|------------|
|      17544 |
+------------+

演示日期部分如何影响 DATEDIFF 计算;此外,还演示使用减号进行日期减法:

SELECT column1 date_1, column2 date_2,
       DATEDIFF(year, column1, column2) diff_years,
       DATEDIFF(month, column1, column2) diff_months,
       DATEDIFF(day, column1, column2) diff_days,
       column2::DATE - column1::DATE AS diff_days_via_minus
  FROM VALUES
       ('2015-12-30', '2015-12-31'),
       ('2015-12-31', '2016-01-01'),
       ('2016-01-01', '2017-12-31'),
       ('2016-08-23', '2016-09-07');
Copy
+------------+------------+------------+-------------+-----------+---------------------+
| DATE_1     | DATE_2     | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|------------+------------+------------+-------------+-----------+---------------------|
| 2015-12-30 | 2015-12-31 |          0 |           0 |         1 |                   1 |
| 2015-12-31 | 2016-01-01 |          1 |           1 |         1 |                   1 |
| 2016-01-01 | 2017-12-31 |          1 |          23 |       730 |                 730 |
| 2016-08-23 | 2016-09-07 |          0 |           1 |        15 |                  15 |
+------------+------------+------------+-------------+-----------+---------------------+

演示时间部分如何影响 DATEDIFF 计算:

ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'DY, DD MON YYYY HH24:MI:SS';
Copy
SELECT column1 timestamp_1, column2 timestamp_2,
       DATEDIFF(hour, column1, column2) diff_hours,
       DATEDIFF(minute, column1, column2) diff_minutes,
       DATEDIFF(second, column1, column2) diff_seconds
  FROM VALUES
       ('2016-01-01 01:59:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP),
       ('2016-01-01 01:00:00'::TIMESTAMP, '2016-01-01 01:59:00'::TIMESTAMP),
       ('2016-01-01 01:00:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP);
Copy
+---------------------------+---------------------------+------------+--------------+--------------+
| TIMESTAMP_1               | TIMESTAMP_2               | DIFF_HOURS | DIFF_MINUTES | DIFF_SECONDS |
|---------------------------+---------------------------+------------+--------------+--------------|
| Fri, 01 Jan 2016 01:59:59 | Fri, 01 Jan 2016 02:00:00 |          1 |            1 |            1 |
| Fri, 01 Jan 2016 01:00:00 | Fri, 01 Jan 2016 01:59:00 |          0 |           59 |         3540 |
| Fri, 01 Jan 2016 01:00:59 | Fri, 01 Jan 2016 02:00:00 |          1 |           60 |         3541 |
+---------------------------+---------------------------+------------+--------------+--------------+
语言: 中文