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语句返回的结果:
OrderIDProductOrderAmtOrderDate
1Test Product122008-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支持这些函数。