SQL Server DATEDIFF:计算时间间隔的介绍

导航到

嗨!您是否曾在SQL数据库中需要计算两个日期之间的差异?如果是这样,我有一个好消息要告诉您:SQL Server有一个强大的内置函数DATEDIFF,可以做到这一点。在这篇文章中,我们将探讨DATEDIFF是什么,它是如何工作的,以及在什么情况下和为什么使用它。我们还将深入一些实际示例,例如找出日期和今天之间的天数以及两个列之间的日期差异。

那么,让我们开始吧!

q-1

DATEDIFF:它是什么?

DATEDIFF是SQL Server的一个强大函数,用于计算两个日期或日期时间的差异,并以整数形式返回结果。当你需要找出某个东西的年龄时,比如用户账户有多少天,或者两个事件之间有多少月时,它非常有用。

DATEDIFF:语法和参数

DATEDIFF的语法相当简单

DATEDIFF(datepart, startdate, enddate)

让我们看看这里使用的参数

  • datepart: 您想要用于计算的时单位,例如年、季度、月、日,甚至是更小的单位,如小时、分钟或秒。

  • startdate: 第一个日期或日期时间值。

  • enddate: 第二个日期或日期时间值。

请注意,DATEDIFF只返回正整数,因此如果结束日期早于开始日期,您将得到一个负结果。

DATEDIFF的工作原理

使用DATEDIFF时,了解其行为非常重要。DATEDIFF计算从startdate到enddate之间跨越的指定datepart边界数量。然而,它不计算两个日期之间的datepart单位数量。相反,它查看单位之间的边界。例如,考虑以下查询

SELECT DATEDIFF(month, '2022-01-29', '2022-02-01');

尽管两个日期之间只有三天,但结果为1,因为月份边界(从一月到二月)只跨越了一次。

DATEDIFF的准确性

DATEDIFF返回整数,这可能导致截断或舍入问题。例如,如果您计算两个日期之间的月数差异,并且结果不是一个整数,DATEDIFF将截断小数部分。例如

SELECT DATEDIFF(month, '2022-01-15', '2022-02-14');

实际差异大约是0.97个月,但DATEDIFF返回0,因为月份边界没有跨越。为了提高精度,您可以使用较小的datepart并将结果转换为所需的单位。例如,您可以计算天数差异,然后除以一个月的平均天数。

SELECT DATEDIFF(day, '2022-01-15', '2022-02-14') / 30.44;

请注意,这只是一个近似值。

q-2

DATEDIFF和边界值

理解DATEDIFF如何处理边界值对于正确计算至关重要。例如,让我们计算2021年12月31日和2022年1月1日之间的年差。

SELECT DATEDIFF(year, '2021-12-31', '2022-01-01');

尽管日期之间只有一个一天的差距,但结果是1,因为跨越了年份边界。同样,计算2022年1月31日和2022年2月1日之间的月差也会得到1,尽管有一个一天的差距。考虑这些边界情况并根据您的具体需求调整计算是必要的。

何时以及为什么使用DATEDIFF

您可能想知道在实际场景中何时使用DATEDIFF。让我们看看一些例子。

  • 计算用户或产品的年龄,以天、月或年为单位。

  • 找出事件或截止日期的天数。

  • 分析两个事件之间的时间,如用户登录或购买。

现在我们已经涵盖了基础知识,让我们看看一些实际例子。

示例1:计算日期与今天的日期差

假设您想找出用户注册以来过了多少天。以下是使用DATEDIFF来完成此操作的方法。

SELECT DATEDIFF(day, signup_date, GETDATE()) AS days_since_signup

FROM users;

在此示例中,我们计算注册日期和当前日期(使用GETDATE()函数)之间的天数差异。

示例2:获取两个列之间的日期差异

假设您有一个包含两个日期列的表,start_date和end_date,并且您想计算它们之间的天数差异。以下是方法。

SELECT DATEDIFF(day, start_date, end_date) AS duration

FROM events;

在此情况下,我们在天数上查找start_date和end_date列之间的差异。

SELECT DATEDIFF

有时,您可能想根据DATEDIFF的输出过滤查询结果。例如,假设您只想显示持续时间超过七天的活动。

SELECT *

FROM events

WHERE DATEDIFF(day, start_date, end_date) > 7;

在此查询中,我们使用DATEDIFF在WHERE子句中过滤结果,基于start_date和end_date列之间的差异。

DATEADD:伴随函数

SQL Server中另一个有用的函数是DATEADD,它允许您从给定的日期或datetime值中添加或减去指定的时间间隔。其语法如下

DATEADD(datepart, number, date)

让我们了解参数

  • datepart: 您想添加或减去的时间单位,如年、季度、月、日、小时、分钟或秒。

  • number: 要添加或减去的单位数。使用正整数添加时间,使用负整数减去时间。

  • date: 您想修改的日期或datetime值。

例如,如果您想找到用户注册日期后的30天日期,您可以这样做

SELECT DATEADD(day, 30, signup_date) AS thirty_days_later

FROM users;

calendar-dates

DATEDIFF在Snowflake、MySQL和PostgreSQL中的使用

尽管DATEDIFF是SQL Server特有的,但其他数据库系统中也有类似的函数。

Snowflake

Snowflake的DATEDIFF函数的语法与SQL Server相同。

SELECT DATEDIFF(datepart, startdate, enddate)

FROM table_name;

然而,支持的日期部分值有所不同。例如,Snowflake 支持以下值:YEAR(年)、QUARTER(季度)、MONTH(月)、WEEK(周)、DAY(日)、HOUR(小时)、MINUTE(分钟)、SECOND(秒)、MILLISECOND(毫秒)、MICROSECOND(微秒)和 NANOSECOND(纳秒)。例如,要计算两个日期之间的周数差异,您可以使用

SELECT DATEDIFF(week, '2022-01-01', '2022-01-15')

FROM table_name;

MySQL

MySQL 使用 TIMESTAMPDIFF 函数来计算两个日期或日期时间的差异

SELECT TIMESTAMPDIFF(unit, startdate, enddate)

FROM table_name;

其中,unit 表示时间单位,如 YEAR(年)、QUARTER(季度)、MONTH(月)、WEEK(周)、DAY(日)、HOUR(小时)、MINUTE(分钟)或 SECOND(秒)。请注意,TIMESTAMPDIFF 返回一个有符号整数,并且 startdate 和 enddate 参数的顺序很重要。因此,如果您交换顺序,结果将具有相反的符号。以下是一个计算两个日期之间小时差异的示例

SELECT TIMESTAMPDIFF(HOUR, '2022-01-01 08:00:00', '2022-01-01 12:00:00')

FROM table_name;

PostgreSQL

PostgreSQL 允许您直接通过相减来计算两个日期或时间戳之间的差异

SELECT end_date - start_date

FROM table_name;

这种减法返回一个间隔值。要从中提取特定的单位,可以使用 EXTRACT 函数

SELECT EXTRACT(unit FROM interval)

FROM table_name;

Here's an example of calculating the difference between two dates in months:

SELECT EXTRACT(MONTH FROM (end_date - start_date))

FROM table_name;

需要注意的是,使用 EXTRACT 时,结果可能不是整数,尤其是在计算月份或年份的差异时。但是,您可以使用 ::integer 类型转换或 floor() 函数将结果转换为整数。

总结

好了,这就是全部内容!您现在已了解 DATEDIFF 的基础知识、其语法和参数以及它是如何工作的。我们还探讨了几个实际示例,如计算日期和今天的日期之间的天数以及获取两列之间的日期差异。此外,我们还介绍了 SELECT DATEDIFF、DATEADD 以及 Snowflake、MySQL 和 PostgreSQL 中的等效函数。

有了这些知识,您现在可以自信地使用 DATEDIFF 和其对应函数来分析和管理 SQL 查询中的日期和时间间隔。

查询愉快!

关于作者

本文由 Juan Reyes 撰写。作为一名企业家、熟练的工程师和心理健康倡导者,Juan 追求可持续的自我成长,体现领导力、机智和热情。拥有超过 15 年的技术行业经验,Juan 有机会在日本和美国与一些最突出的移动开发、Web 开发和电子商务公司合作。