比较 DATEADD 和 DATEDIFF

更新日期: 2006 年 4 月 14 日

DATEADD 函数向指定日期添加一段时间间隔。例如,如果 SalesOrderHeader 表中所有订单到期日期都推迟 3 天,可以使用以下语句来得到新的日期:

USE AdventureWorks;
GO
SELECT DATEADD(day, 3, DueDate)
FROM Sales.SalesOrderHeader;
GO

如果日期参数的数据类型是 smalldatetime,则结果的数据类型也是 smalldatetime。可以使用 DATEADD 向 smalldatetime 值添加秒或毫秒,但只有当 DATEADD 返回的结果日期的改变不小于 1 分钟时,这样做才有意义。

DATEDIFF 函数计算指定的两个日期中第二个日期与第一个日期的时间差的日期部分。换句话说,它得出两个日期之间的间隔。结果是带正负号的整数值,它等于日期部分中的 date2 - date1

以下查询使用日期 November 30, 2001,查找 DueDate 与此日期之间的天数:

USE AdventureWorks;
GO
SELECT DATEDIFF(day, DueDate, 'Nov 30 2001')
FROM Sales.SalesOrderHeader;
GO

对于 SalesOrderHeaderDueDate 为 2001 年 10 月 21 日的行,上个查询生成的结果为 40。(10 月 21 日与 11 月 30 日之间的天数为 40 天。)若要计算以月为单位的时间间隔,请使用以下查询:

USE AdventureWorks;
GO
SELECT interval = DATEDIFF(month, DueDate, 'Nov 30 2001')
FROM Sales.SalesOrderHeader;
GO

该查询对 DueDate 在 10 月的行计算出的值为 1,对 DueDate 在 6 月的行计算出的值为 5。

若 DATEDIFF 函数中的第一个日期晚于指定的第二个日期,则得到的结果为负数。

如果一个或两个日期参数是 smalldatetime 值,它们将在内部转换为 datetime 值,以便进行计算。smalldatetime 值中的秒和毫秒都自动设置为 0,以便进行计算。

ms187081.note(zh-cn,SQL.90).gif注意:
DATEDIFF 返回两个指定日期之间所跨的日期和时间边界的数目。在以下示例中,第一个语句返回 1 年。(即 2006 - 2005 = 1)第二个语句返回 1 个月。(即 2006 年 1 月 - 2005 年 12 月)第三个语句返回 12 作为两个日期之间的天数。
SELECT DATEDIFF(year, '20051220', '20060101')
SELECT DATEDIFF(month, '20051220', '20060101')
SELECT DATEDIFF(day, '20051220', '20060101')

请参阅

其他资源

CAST 和 CONVERT (Transact-SQL)
DATENAME (Transact-SQL)
日期和时间函数 (Transact-SQL)
DATEPART (Transact-SQL)
DATEADD (Transact-SQL)
GETDATE (Transact-SQL)
DATEDIFF (Transact-SQL)
SET DATEFORMAT (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2006 年 4 月 14 日

新增内容:
  • 添加了有关 DATEDIFF 如何计算两个日期部分之间时间差的信息。