正确使用SQL Server的datetime函数:GETDATE、DATENAME和DATEPART(一)

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

Transact-SQL包含一组函数可以用于检索当前的日期和时间或一个DATETIME或SMALLDATETIME值的某个部分。比如,你可以在DATETIME值中提取日、月或年以及季度、周、小时甚至毫秒。在本文中,我将对这些函数进行阐述并举例说明如何使用SQL Server中的这些函数来查询数据的。注意,本文假定你已经具备了一定的T-SQL、DATETIME和SMALLDATETIME数据类型的知识。

想获得更多这些类型的信息,你可以阅读这一系列的第一部分“SQL Server 2005的DATETIME和SMALLDATETIME基础”。 检索当前日期和时间 在T-SQL中最便捷的一个函数就是……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

Transact-SQL包含一组函数可以用于检索当前的日期和时间或一个DATETIME或SMALLDATETIME值的某个部分。比如,你可以在DATETIME值中提取日、月或年以及季度、周、小时甚至毫秒。在本文中,我将对这些函数进行阐述并举例说明如何使用SQL Server中的这些函数来查询数据的。注意,本文假定你已经具备了一定的T-SQL、DATETIME和SMALLDATETIME数据类型的知识。想获得更多这些类型的信息,你可以阅读这一系列的第一部分“SQL Server 2005的DATETIME和SMALLDATETIME基础”。

检索当前日期和时间

在T-SQL中最便捷的一个函数就是GETDATE,它根据本地系统的时钟设置检索当前日期和时间。使用GETDATE,只需直接调用T-SQL语句中的函数而不用指定任何参数,如下例所示:


SELECT GETDATE() AS [Current Date/Time]

在这里,我在SELECT中使用GETDATE来检索日期/时间值。(注意,即使你不需要任何参数,你必须使用括号。)语句返回的结果如下:

Current Date/Time

2008-07-29 10:45:13.327

默认情况下,GETDATE函数返回如下格式的时间值。然而,你可以使用CONVERT函数修改结果的格式。关于CONVERT的使用,可以参考这一技巧系列“从date/time值到字符类型的数据转换”。

Transact-SQL的另外一个简单的函数是GETUTCDATE,它用于检索当前的Coordinated Universal Time (UTC)——也就是格林威治标准时间。检索的值是基于本地系统上的时钟和时区设置的。正如你在GETDATE中所看到的,你在Transact-SQL语句中调用GETUTCDATE是不需要包括任何参数的,如下例所示:


SELECT GETUTCDATE() AS [UTC Date/Time]

你运行这个语句时,你会得到如下的结果:

UTC Date/Time

2008-07-29 17:45:13.327

注意,这里返回的时间比前面显示的例子要晚7个小时。但我在一个配置为太平洋时区(在夏时制的白天)的系统上同时运行这些语句。

正如你在最后两个例子中所看到的,这些函数都是包含在SELECT列表中的。但是,当用它们来定义你定义表的默认值时,这些函数是特别有用的。比如,下面的三个语句所创建的Orders表格——包括一个DATETIME字段(OrderDate)——在表格中插入数据并检索该数据:


CREATE TABLE Orders 
(
OrderID INT PRIMARY KEY IDENTITY, 
Product VARCHAR(30) NOT NULL, 
OrderAmt INT NOT NULL, 
OrderDate DATETIME NOT NULL DEFAULT GETDATE()

GO
INSERT INTO Orders (Product, OrderAmt) 
VALUES('Test Product', 12) 
GO
SELECT * FROM Orders 

OrderDate字段定义包含一个指定GETDATE作为默认值的DEFAULT子句。因此,当你在表格中插入行时,当前日期和时间将自动插入列中,下面显示了SELECT语句返回的结果:

OrderID

Product

OrderAmt

OrderDate

1

Test Product

12

2008-07-29 10:46:47.420

你可以将这些信息作为一个时间戳来使用,以便在需要时跟踪加入的记录或协助数据审计。这也方便其它使用时间戳检索数据的操作。比如,当决定是否提取或更新数据时,抽取、转换和加载(ETL)程序可能参考时间戳。

检索年、月或日

在某些情况下,你可能想要在DATETIME或SMALLDATETIME值中检索年、月或日。其中一个函数是使用YEAR、MONTH或DAY函数来检索必要的数据(作为一个整数)。下面的SELECT语句就是一个很好的说明:


SELECT YEAR(PostTime) AS [Year], 
MONTH(PostTime) AS [Month], 
DAY(PostTime) AS [Day] 
FROM DatabaseLog
WHERE DatabaseLogID = 1 

SELECT子句中包含了三个字段表达式。第一个使用的是YEAR函数来检索DatabaseLog表格(AdventureWorks中的样本数据库)中的PostTime字段的年。当调用YEAR函数时,指定字段的名称(或其它表达式)作为函数的参数。MONTH和DAY函数也是一样的运行方式。在SELECT子句中的第二个字段表达式使用DAY来检索日。下面的结果显示了语句返回的信息类型:

每一个值都是在PostTime字段中提取并作为一个整数返回的。(存储在表中的值是2005-10-14 01:58:27.567。)

这些函数都是检索年、月或日的简单方式,但是,在某些情况下,你可能想更多的控制返回的值的类型以及这些值的格式。另外,你可能想从日期/时间值中提取时间。幸运的是,Transact-SQL支持这些函数。

翻译

曾少宁
曾少宁

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

相关推荐