使用DATEDIFF方法 DATEDIFF方法可以计算两个日期之间的时间间隔,并返回一个代表间隔的整数。这个方法使用下面的语法: DATEDIFF(<date/time_part>, <start_date>, <end_date>) <date/time_part>占位符指的是两个日期中需要比较的部分。比如,你想确认开始日期和结束日期之间的小时数或天数。 除了工作日(dw, w)缩写之外,<date/time_part>占位符使用的缩写与DATEADD方法一样。
DATEDIFF不支持工作日比较。 <star……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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的能源管理》等。
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。