SQL Server 2008中新的datetime数据类型具有灵活性(一)

日期: 2008-10-22 作者:Robert Sheldon翻译:April 来源:TechTarget中国 英文

在这一技巧系列中我讲了SQL Server的datetime值的很多方面。我所举的这些例子都是用在SQL Server 2005中的,尽管我在那些文章中讨论的东西在SQL Server 2008中也同样适用。在这篇技巧中,我将进一步讨论datetime值,并特别强调能够用在SQL Server2008中新的datetime数据类型。它们包括DATE、TIME、DATETIME2以及DATETIMEOFFSET类型,因为这些类型T-SQL语言都支持。

为了说明这些数据类型,我使用了下面的代码在AdventureWorks2008抽样数据库中创建了Sales.OrderDates,并在表中插入了测……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

在这一技巧系列中我讲了SQL Server的datetime值的很多方面。我所举的这些例子都是用在SQL Server 2005中的,尽管我在那些文章中讨论的东西在SQL Server 2008中也同样适用。在这篇技巧中,我将进一步讨论datetime值,并特别强调能够用在SQL Server2008中新的datetime数据类型。它们包括DATE、TIME、DATETIME2以及DATETIMEOFFSET类型,因为这些类型T-SQL语言都支持。

为了说明这些数据类型,我使用了下面的代码在AdventureWorks2008抽样数据库中创建了Sales.OrderDates,并在表中插入了测试数据:


USE AdventureWorks2008 
GO
IF EXISTS (SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'Sales'
AND table_name = 'OrderDates') 
DROP TABLE Sales.OrderDates
GO
CREATE TABLE Sales.OrderDates
(
OrderID INT NOT NULL, 
Date_Type DATE NULL, 
Time_Type TIME(7) NULL, 
DateTime2_Type DATETIME2(7) NULL, 
DateTimeOffset_Type DATETIMEOFFSET(7) NULL

GO
INSERT INTO Sales.OrderDates
VALUES(1001, '2008-09-22', '18:27:10.1234567', 
'2008-09-22 18:27:10.1234567', '2008-09-22 18:27:10.1234567 -07:00') 

如果你想测试这些文章中的例子,你也可以在AdventureWorks2008数据库或者在另外的数据库中创建这种表。若你决定用AdventureWorks2008数据库,你可以从CodePlex中获取一些必要的文档。

DATE数据类型

在SQL Server 2008之前,主要datetime数据类型就是DATETIME和SMALLDATETIME。每一种情况中存储在这一类型中的值包括日期和时间,也没有办法只存储一部分。然而,SQL Server 2008改变了所有的DATE和TIME数据类型。

从它的名称我们也可以知道,DATE数据类型包含了一个日期值。这一日期值可以从公元一世纪一月一日到公元9999年12月31日。这一日期值包括年、月和天。例如,以下SELECT语句就可以从OrderID和Date_Type列中找回数据。


SELECT OrderID, Date_Type FROM Sales.OrderDates

Date_Type列是由DATE数据类型设置的,所以这些retrieved value中只包括了一个日期,其结果如下:


OrderID Date_Type 
1001 2008-09-22 

在这种情况下,DATE值中就包括了年、然后是月和日期。但是,重新获取的日期格式是目前设置在SQL Server中的语言。

如果你想将datetime值返回到一个DATE值,你可以改变它,如下面的SELECT语句所示:


SELECT OrderID, CAST(DateTimeOffset_Type AS DATE) AS ConvertedType
FROM Sales.OrderDates

这时,该语句从DateTimeOffset_Type列中找回了DATE值,它是用DATETIMEOFFSET数据类型设置的(在下文中会有详细解释)。尽管retrieved value中包含了日期和时间数据,这一语句返回的结果和之前的语句返回的结果一样。 换句话说,就是时间部分的值是可以忽略不计的。

将数据插入到DATE列中,你就能指定一个date值或者datetime值,如下所示:


INSERT INTO Sales.OrderDates (OrderID, Date_Type)
VALUES (1002, '2008-09-20');
INSERT INTO Sales.OrderDates (OrderID, Date_Type)
VALUES (1003, '2008-09-21 18:27:10.1234567');

指定了datetime值后,SQL Server就自动将这些值转换成DATE数据类型,也就意味着只有日期部分被保存了。

TIME数据类型

TIME数据类型只保存在time值中。这些值自身就支持小数后7位的精确度。也就是说小数部分最多可支持7个小数位。这是在和DATETIME值相比较的情况下得出的结论,DATETIME值只支持小数点后3位。

你T-SQL语句中指定TIME数据类型后,就能通过包括括号中的插入语指定存储值得精确度。例如,指定7个小数位,你就可以指定TIME(7)。要指定5个小数位,你就可以指定成为TIME(5)等等。如果你不想指定精确度,就假定是7。

TIME数据类型返回的数据格式为:时、分、秒和小数秒(fractional second)。例如,下面的SELECT语句就是从Time_Type列中重新获取数据。

SELECT OrderID, Time_Type FROM Sales.OrderDates

Time_Type列是由TIME(7)数据类型设置的,所以她返回的数据类型如下所示:


OrderID Time_Type 
1001 18:27:10.1234567 

注意这些列返回的数据只有时间和小数精确度为7位的数值。

看到这些DATE数据类型时,你还能够从datetime列中返回一个TIME值。例如:下面的语句是从DateTimeOffset_Type列中重新找回数据并将这些数据值变换为TIME(7):

SELECT OrderID, CAST(DateTimeOffset_Type AS TIME(7)) AS ConvertedType
FROM Sales.OrderDates

这一SELECT语句返回的结果和之前的SELECT语句返回的结果相同。

但是你也可以在转换数据时另外指定一个精确度,如下所示:

SELECT OrderID, CAST(DateTimeOffset_Type AS TIME(5)) AS ConvertedType
FROM Sales.OrderDates

小数秒部分现在包括五个小数位:


OrderID ConvertedType 
1001 18:27:10.12346 

注意小数秒现在已经舍弃取整数了。原先的小数秒为.1234567。但是如果你指定精确度为5位,SQL Server就会精确舍弃小数部分的"67",在结果中只剩下.12346,而不是.12345。将数据插入到TIME列中后,你就可以指定一个time值或者是datetime值了。如下列INSERT语句所示:


INSERT INTO Sales.OrderDates (OrderID, Time_Type)
VALUES (1004, '18:27:10.1234567');
INSERT INTO Sales.OrderDates (OrderID, Time_Type)
VALUES (1005, '2008-09-20 18:27:10.1234567');

在这两种情况下,只有时间值才能插入到Time_Type列中。

翻译

April
April

相关推荐