在这一技巧系列中我讲了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中国
在这一技巧系列中我讲了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列中。
翻译
相关推荐
-
如何解决和避免SQL Server数据库死锁
学习如何避免SQL Server数据库死锁的第一步是做好准备工作。根据SQL Server专家的说法,了解死锁 […]
-
如何使用SQL Server数据库脚本创建数据库?
你可以手工创建SQL Server数据库,但懂得如何设置数据库脚本是十分必要的。本文是执行数据库创建脚本所涉及的步骤。
-
如何为你的数据库事务日志减肥?
在大多数SQL Server的工作环境中,尤其是在OLTP环境中,数据库的事务日志性能出现瓶颈时往往会导致事务完成需要更多的时间。
-
SQL Server 2008将退出微软主流数据库支持
你的企业是否还在运行SQL Server 2008?请注意微软为SQL Server 2008提供的主流技术支持服务将于今年的7月8日正式结束。