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

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

DATETIME2数据类型 DATETIME2数据类型和DATETIME数据类型很相似。它们之间的不同之处就是DATETIME2支持范围更广的数据(和DATE一样)并且精确性也更高(和TIME一样)。如同TIME数据类型一样,你可以指定它的精确度。 换句话说,DATETIME2主要是连接DATE值以及TIME值。

例如,用下面SELECT语句就可以从DateTime2_Type列中返回数据,这些数据被设置成为DATETIME2列。 SELECT OrderID, DateTime2_Type FROM Sales.OrderDates 语句返回数据的结果如……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

DATETIME2数据类型

DATETIME2数据类型和DATETIME数据类型很相似。它们之间的不同之处就是DATETIME2支持范围更广的数据(和DATE一样)并且精确性也更高(和TIME一样)。如同TIME数据类型一样,你可以指定它的精确度。

换句话说,DATETIME2主要是连接DATE值以及TIME值。例如,用下面SELECT语句就可以从DateTime2_Type列中返回数据,这些数据被设置成为DATETIME2列。


SELECT OrderID, DateTime2_Type FROM Sales.OrderDates

语句返回数据的结果如下::


OrderID DateTime2_Type 
1001 2008-09-22 18:27:10.1234567 

正如你看到的一样,DATETIME2首先提供的是日期值,然后是时间,精确度为7位。除了小数秒7位之外,这个值看起来就好像是DATETIME值或者是一个后面附着有TIME值的DATE值。

你还可以将其他的datetime转换为DATETIME2值,如下列语句所示:


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

注意我在将DATETIMEOFFSET值转换到DATETIME2的过程中,制定的精确度是7位。这一语句返回的结果和先前的语句返回的结果一样。

但是如果你转换其他类型的数值,你得到的结果就不一样了。例如:下面的语句从Date_Type列中找回的数据就属于DATE数据类型,将这些数据转换成DATETIME2(7):

SELECT OrderID, CAST(Date_Type AS DATETIME2(7)) AS ConvertedType
FROM Sales.OrderDates

在SQL Server转换这些值时,它给新值增加一个默认时间,其结果显示如下:


OrderID ConvertedType 
1001 2008-09-22 00:00:00.0000000 

注意这些时间都是零(精确度为7位),也就是24小时的第一个值。无论你何时需要假定时间(如在这种情况下),所有这些零都用到了,也就是说默认时间值为00:00:00.0000000。

然而日期的默认值很不一样。在下面的语句中,我将Time_Type列中属于TIME数据类型的数值转换到了DATETIME2(7)中:


SELECT OrderID, CAST(Time_Type AS DATETIME2(7)) AS ConvertedType
FROM Sales.OrderDates

因为TIME值没有包括这些日期,SQL Server假定了一个日期,结果如下:


OrderID ConvertedType 
1001 1900-01-01 18:27:10.1234567 

所以,在没有日期默认值时日期显示的是1900年1月1日。

DATETIMEOFFSET数据类型

DATETIMEOFFSET数据类型和DATETIME2的数据类型一样,除此之外,DATETIMEOFFSET值还增加了很重要的一项:时区偏移(time-zone offset)值。该偏移值代表一系列在Coordinated Universal时间(UTC)前后小时和分钟的数字。正数就代表在UTC基础之上增加的时间数,这样得到的就是本地时间。负数是从UTC时间的基础上减去这个数字就是当地时间。

我们看看下面的一个例子,这样更易于理解。下面的SELECT语句用于从DateTimeOffset_Type列中找回数据,这些数据就属于DATETIMEOFFSET数据类型:


SELECT OrderID, DateTimeOffset_Type FROM Sales.OrderDates

在下面的结果中,你能看到DATETIMEOFFSET值包括时区偏移数值07:00。


OrderID DateTimeOffset_Type 
1001 2008-09-22 18:27:10.1234567 -07:00 

返回值表示你必须从datetime值中减去七小时,这样才能得到当地时间。

在你将另外一种datetime值转换为DATETIMEOFFSET值时,时区偏移值就默认为+00:00。例如:以下SELECT语句就将DATETIME2转换为DATETIMEOFFSET:


SELECT OrderID, CAST(DateTime2_Type AS DATETIMEOFFSET(7)) AS ConvertedType
FROM Sales.OrderDates

结果如下:


OrderID ConvertedType 
1001 2008-09-22 18:27:10.1234567 +00:00 

现在的时区偏移值为+00:00,在这种情下,UTC时间和当地时间相同。

如果你想将DATE值转换成为DATETIMEOFFSET,那么该数值的时间部分就都是零。例如,以下语句就用于Date_Type值转换成为DATETIMEOFFSET(7):


SELECT OrderID, CAST(Date_Type AS DATETIMEOFFSET(7)) AS ConvertedType
FROM Sales.OrderDates

返回结果如下:


OrderID ConvertedType 
1001 2008-09-22 00:00:00.0000000 +00:00 

注意时间和时区偏移值都设为零。

但是,如果你将TIME值、返回值的时间部分都设为1900年1月1日(默认值),如以下SELECT语句所示:


SELECT OrderID, CAST(Time_Type AS DATETIMEOFFSET(7)) AS ConvertedType
FROM Sales.OrderDates

该结果就显示被转换了的数据:

OrderID ConvertedType 
1001 1900-01-01 18:27:10.1234567 +00:00 

时间被设成默认值,时区偏移值设为+00:00。只有时间值自身才反映出原始值。

你可以看出,DATETIMEOFFSET数据类型和DATE、TIME以及DATETIME2数据类型大大扩展了SQL Server的datetime容量。现在你可以将日期和时间值当作独立值来运用,运用范围更广的日期值并将time值定义得更加精确。想查询更多有关这些数据类型的信息,请查看数据Microsoft SQL Server 2008联机丛书。

翻译

April
April

相关推荐