编程开发 > MSSQL > 文章内容

SQLServer2008中新的日期时间数据类型

2011-8-29编辑:mal

SQL Server 2008 终于发布新版了,虽然还只是另一个社区测试版而非完全版。每当新软件发布,大 家最关系的问得最多的问题就是:有些什么新特性?SQL Server 2008有很多新功能和新工具。不过,本文 还是主要为大家介绍SQL Server 2008七月预览版引入的新数据类型,并对DATETIME数据类型的功能进行 专门讨论。

SQL Server 2008中DATETIME功能的最大转变就是引入了四种DATETIME数据类型,分别为 DATE、TIME、DATETIMEOFFSET和DATETIME2;此外还增加了新的DATETIME函数功能。

下面首先来讨 论一下四种新数据类型的功能和用法。

DATE数据类型

在SQL Server 2005中,没有专门只 用来存储日期(不包括时间)的特定数据类型,只能使用DATETIME或SMALLDATETIME数据类型来完成此操作 。但是,当你输入日期之后,会显示还有一个时间的组分需要输入,其初始显示为12:00 AM。如果只想在 输出结果中显示日期那一部分,就必须修改输出格式。大部分情况下,可以使用getdate()函数来存储当 前日期。要在SQL Server 2005中的SMALLDATETIME或DATETIME列中保存getdate()的函数值,同时也会保 存了当前的时间,而这可能会引发很多问题。举例而言,如果你使用以下的语句,想根据给定的日期来搜 索记录:

SELECT * FROM tblDate Where [Date] = '2007-12-01'

由于Date列里 含有时间组分,这个命令将无法正常执行, 因此,你必须执行以下的查询操作:

SELECT * FROM tblDate Where datediff(d,[Date],‘2007-12-01’) =0

尽管上面的查询操作可以行 得通,不过Date列中符合要求的索引很可能不会被使用。不过你还是可以使用上面的查询操作调出少量的 记录。虽然可以利用工作区,但很明显有必要增加一种去掉时间值的DATE数据类型来减少潜在的错误。来 看看以下的语法:

DECLARE @dt as DATE
SET @dt = getdate()
PRINT @dt

以上脚本的输出结果只有日期,不包括时间部分。DATE数据类型的取值范围从0001-01-01到9999-12- 31。

TIME数据类型

就像日期数据类型一样,如果你只想存储时间数据而不需要日期部分就 可以利用TIME数据类型。下面就是利用TIME数据类型进行查询的例子:

DECLARE @dt as TIME
SET @dt = getdate()
PRINT @dt

以上脚本输出结果只包含时间部分,其取值范围从00:00:00.0000000到23:59:59.9999999。

DATETIME2数据类型

新的DATETIME2数据类型也是一种数据时间混合的数据类型,不过其时 间部分秒数的小数部分可以保留不同位数的值,比原来的DATETIME数据类型取值范围要广。用户可以根据 自己的需要通过设置不同的参数来,设定小数位数,最高可以设到小数点后七位(参数为7),也可以不要 小数部分(参数为0),以此类推。以下是利用DATETIME2的查询语句:

DECLARE @dt7 datetime2(7)
SET @dt7 = Getdate()
PRINT @dt7
   --result is 2008-01-3 12:15:11.2340000

该语句的输出结果中时间的秒数部分精确到小数点后第七位。具体参考如下:

Fraction Output
0 2007-10-28 22:11:20
1 2007-10-28 22:11:19.7
2 2007-10-28 22:11:19.70
3 2007-10-28 22:11:19.703
4 2007-10-28 22:11:19.7030
5 2007-10-28 22:11:19.70300
6 2007-10-28 22:11:19.703000
7 2007-10-28 22:11:19.7030000

DATETIMEOFFSET数据类型

如果把日期和时间数据保存在一列里,是不会提示该日期和时间属于 哪一个时区的。时区的提示非常重要,特别是当你处理数据包含了多个不同时区的国家时。新的 DATETIMEOFFSET数据类型可以定义一个日期和时间组合,其中时间以24小时制显示,并带有时区提示。下 面的语句说明了DATETIMEOFFSET数据类型的用法:

DECLARE @dt DATETIMEOFFSET(0)
SET @dt = '2007-12-04 21:20:30 -1:00'
DECLARE @dt1 DATETIMEOFFSET(0)
SET @dt1 = '2007-12-04 21:20:30 +5:00'
SELECT DATEDIFF(hh,@dt,@Dt1)

DateTime函数

目前我们可以在SQL Server 2005和SQL Server 2000中使用GETDATE函数来查询 当前的日期和时间。此外,在SQL Server 2005中,还有另外几个类似的日期时间函数,分别为: CURRENT_TIMESTAMP、DATEADD、DATEDIFF、DATENAME、DATEPART、GETUTCDATE、DAY、 MONTH和YEAR。而 在SQL Server 2008中,除了上述这些函数外,又新增了五个函数,分别为SYSDATETIME、 SYSDATETIMEOFFSET、SYSUTCDATETIME、SWITCHOFFSET和TODATETIMEOFFSET。其中SYSDATETIME函数返回目 前系统的时间戳,不带时区提示,能够精确到毫秒级。SYSDATETIMEOFFSET函数和SYSDATETIME函数功能类 似,不过包含了时区值。SYSUTCDATETIME返回以世界标准时间(又称协调世界时,也就是格林威治时间)表 示的日期和时间,也精确到毫秒级,是根据当前SQL Server运行所在地服务器所设置的本地时间和时区得 来的。SYSDATETIME和SYSUTCDATETIME两个函数返回的都是DATETIME2数据类型,而SYSDATETIMEOFFSET函 数返回DATETIMEOFFSET数据类型。

SWITCHOFFSET函数

SWITCHOFFSET函数返回 DATETIMEOFFSET数据类型的值,不再根据存储的时区偏移值取值,而是根据设定的新时区偏倚值来取值。 看看下面这个语句:

SELECT SYSDATETIMEOFFSET(), SWITCHOFFSET (SYSDATETIMEOFFSET(), '-14:00')

该脚本返回两个列,第一列是根据世界标准时间得到的当前日期和时间值,第 二列则是根据给定的时区偏移值返回的日期时间值。

TODATETIMEOFFSET函数

TODATETIMEOFFSET函数可以把本地日期或时间值以及特定的时区偏移值转变为一个 datetimeoffset值。运行以下脚本,你会看到返回的结果中除了当前日期和时间外,还增加了时区值。

SELECT TODATETIMEOFFSET (GETDATE(),'+11:00')

转换函数

CONVERT函数 可以从DATETIME数据类型的组成中抽取时间值或者日期值。运行以下脚本,返回结果的第一列为当前日期 ,第二列为当前时间。

SELECT CONVERT(date, GETDATE()),CONVERT(time, GETDATE())

使 用新DATETIME数据类型进行转换的注意事项

如果你要增加DATE和TIME列,不能够像SMALLDATETIME 数据类型一样加载,否则会返回以下的错误信息:Operand data type date is invalid for add operator。

你可以尝试把这两列设置为浮点型数据,一起存入,并把结果转换成SMALLDATETIME或 DATETIME列。(记住,当SMALLDATETIME数据存储成浮点型时,日期值为整数部分而时间值为小数部分)不 过,这也会返回一个错误信息:Explicit conversion from data type date to float is not allowed 。

正确的做法是把两列都转换为SMALLDATETIME数据,并一起存入。例如使用以下脚本,你就可以 得到输出结果:

Declare @dt as DATE
Set @dt = getdate()
Declare @dtt as TIME
Set @dtt = getdate()
Select cast(@dt as smalldatetime) + cast(@dtt as smalldatetime)

SQLServer性能调优杂记(二)----傻瓜机的失效效应续

热点推荐

登录注册
触屏版电脑版网站地图