使用DATEADD和DATEDIFF来计算SQL Server的DATETIME值(二)

日期: 2009-02-19 作者:Robert Sheldon翻译:曾少宁 来源:TechTarget中国 英文

使用DATEDIFF方法 DATEDIFF方法可以计算两个日期之间的时间间隔,并返回一个代表间隔的整数。这个方法使用下面的语法: DATEDIFF(<date/time_part>, <start_date>, <end_date>) <date/time_part>占位符指的是两个日期中需要比较的部分。比如,你想确认开始日期和结束日期之间的小时数或天数。 除了工作日(dw, w)缩写之外,<date/time_part>占位符使用的缩写与DATEADD方法一样。

DATEDIFF不支持工作日比较。 <star……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

使用DATEDIFF方法

DATEDIFF方法可以计算两个日期之间的时间间隔,并返回一个代表间隔的整数。这个方法使用下面的语法:


DATEDIFF(<date/time_part>, <start_date>, <end_date>)

<date/time_part>占位符指的是两个日期中需要比较的部分。比如,你想确认开始日期和结束日期之间的小时数或天数。

除了工作日(dw, w)缩写之外,<date/time_part>占位符使用的缩写与DATEADD方法一样。DATEDIFF不支持工作日比较。

<start_date>占位符指的是比较的开始日期,而<end_date>占位符指的是结束日期。换言之,方法将返回开始日期和结束日期之间的具体时间或日期间隔。

让我们举例来说明它是如何工作的。下面的SELECT语句计算了Sales.Orders 表中OrderDate和DelivDate值之间的时间间隔:


SELECT OrderDate, DelivDate, 
DATEDIFF(dd, OrderDate, DelivDate) AS DaysDiff
FROM Sales.Orders
WHERE OrderID = 1002

在这个语句中,我在SELECT列表中使用了DATEDIFF。这个方法的第一参数指定间隔必须是天数(dd),而第二个参数指定OrderDate作为开始日期,然后第三个参数指定DelivDate作为结束日期。因此,DATEDIFF将计算OrderDate和DelivDate之间的天数,在此例子中,它是7天,如下结果所示:

OrderDate

DelivDate

DaysDiff

2008-08-27 13:40:22.357

2008-09-03 13:40:22.357

7

当然,它也可以用来计算各种时间间隔,如下例的语句所示:


SELECT OrderDate, DelivDate, 
DATEDIFF(hh, OrderDate, DelivDate) AS HoursDiff
FROM Sales.Orders
WHERE OrderID = 1002

在这种情况下,方法的第一个参数是小时(hh)而非天数。因此,方法将返回OrderDate 和DelivDate值之间相差的小时数,如下结果所示:

OrderDate

DelivDate

HoursDiff

2008-08-27 13:40:22.357

2008-09-03 13:40:22.357

168

两个值之间相差168个小时。

与DATEADD方法一样,DATEDIFF方法并不仅限于用在SELECT语句中。比如,DATEDIFF可以用在UPDATE语句的WHERE子句中,以确定哪一行需要更新。在下例中,我使用了DATEDIFF来指定这些在OrderDate和DelivDate值之间天数少于8的行。


UPDATE Sales.Orders
SET DelivDate = DATEADD(dd, 3, DelivDate)
WHERE DATEDIFF(dd, OrderDate, DelivDate) < 8
GO
SELECT OrderID, OrderDate, DelivDate, 
DATEDIFF(dd, OrderDate, DelivDate) AS DaysDiff
FROM Sales.Orders

在前面的例子中,DATEDIFF方法返回了OrderDate和DelivDate值之间的天数。然后这个数目将与8作比较。如果天数少于8,那么这一行将被更新;否则,该行将不改变。对于这些需要更新的行,我使用DATEADD方法来增加三天到DelivDate值中。然后,我运行一个SELECT语句来返回Sales.Orders表的数据以及计算每个行中两个日期的不同,如下结果所示:

OrderID

OrderDate

DelivDate

DaysDiff

1001

2008-08-27 13:36:16.280

2008-09-08 18:27:10.750

12

1002

2008-08-27 13:40:22.357

2008-09-06 13:40:22.357

10

结果显示现在在两个日期(第二行中)之间是相差10天,而非原来的7天。

在表定义中使用DATEADD和DATEDIFF

DATEADD和DATEDIFF方法也可以用在表定义中。例如,字段定义的DEFAULT子句中可以用DATEADD方法或使用DATEDIFF方法来创建一个计算得来的字段。在下面的Transact-SQL代码中,我首先创建了使用DATEADD和DATEDIFF的表,然后添加一行数据到表中,最后检索表的数据:


USE AdventureWorks
GO
IF EXISTS (SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'Sales'
AND table_name = 'Orders')
DROP TABLE Sales.Orders
GO
CREATE TABLE Sales.Orders
(
OrderID INT NOT NULL,
OrderDate DATETIME NOT NULL DEFAULT GETDATE(),
DelivDate DATETIME NOT NULL DEFAULT DATEADD(dd, 10, GETDATE()),
DaysDiff AS DATEDIFF(dd, OrderDate, DelivDate)

GO
INSERT INTO Sales.Orders(OrderID)
VALUES(1001)
GO
SELECT OrderID, OrderDate, DelivDate, DaysDiff
FROM Sales.Orders

在CREATE TABLE语句中,我创建了四个字段,其中三个存储日期/时间数据。OrderDate字段直接使用GETDATE来生成默认值。DelivDate字段也有一个默认值。然而,这个默认值是基于DATEADD返回的结果的,同时,在这种情况下,我使用方法增加10天到GETDATE返回的值存储到DelivDate字段中。最后,DaysDiff字段是一个计算得来的字段,它的值是使用DATADIFF来计算OrderDate和DelivDate值之间的天数差。

在表定义之后,我插入一数据行到表中。因为所有的日期/时间值都是自动生成的,因此我仅仅需要插入OrderID值,如下所示:

OrderID

OrderDate

DelivDate

DaysDiff

1001

2008-08-27 13:42:50.433

2008-09-06 13:42:50.433

10

DATEADD和DATEDIFF方法不仅仅在表定义中非常有用,同样也适用于查询和数据修改语句。通过DATEADD,我们可以将日期/时间值增加和减少一定值,而通过DATEDIFF,我们可以计算日期/时间值之间的时间间隔。更多详细的关于这些方法的信息,可以阅读Microsoft SQL Server Books Online。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐