在我们开始讨论SQL Server 2008中新的日期数据类型之前,先来回顾一下SQL Server 2005中以及更老版本中提供的两种日期数据类型,这些旧的数据类型是DATETIME和SMALLDATETIME,这两个数据类型在SQL Server 2008中仍然可以使用。

AD:

你是否曾经想在数据库中存储一个日期而没有时间部分,或者想存储一个时间值希望有更高的精度?在SQL Server 2008的介绍中,微软介绍了一些新的日期数据类允许你只存储一个日期、更高精度的时间值等。这些新的数据类型为你存储日期和时间相关信息提供了一些附加选项。在本篇文章中,我将介绍这些新的日期数据类型以及与旧版本的SQL Server中现有的数据类型进行比较。

回顾旧的日期数据类型

在我们开始讨论SQL Server 2008中新的日期数据类型之前,先来回顾一下SQL Server 2005中以及更老版本中提供的两种日期数据类型,这些旧的数据类型是DATETIME和SMALLDATETIME,这两个数据类型在SQL Server 2008中仍然可以使用。

DATETIME数据类型存储把日期和时间部分作为一个单列值在一起存储,该数据类型支持日期从1753年1月1日到9999年12月31日,时间部分的精确度是3.33毫秒,它需要8字节的存储空间。SMALLDATETIME数据类型比起DATETIME类型来说需要更少的存储空间,只有4字节,但是支持更小的日期和时间范围。SMALLDATETIME只支持日期从1900年1月1日到2079年6月6日,时间部分只能够精确到分钟。

这两种有限的日期格式限制了你在存储更早日期以及更高精度的时间时的选择,它们的不足之处使得难以从其它支持不同日期和时间范围的数据结构进行数据迁移,与SQL Server 2008中新的日期数据类型相比,在存储日期和时间时有了更多的选择。

DATITIME2

DATETIME2数据类型是对DATETIME数据类型的一个扩展,该新的数据类型扩展了可以接受日期的范围和在日期/时间值的时间部分添加附加精度。DATETIME2列支持日期从0001-01-01到9999-01-01。扩大的日期范围现在允许你存储更早的日期而无需使用一些创造性的编码算法。

DATETIME2中的时间部分的精确度依赖于你如何定义DATETIME2列,时间部分能够存储一个只有小时、分钟和秒的时间值,或者它能够支持在不同的精确定存储微秒,最多有7位小数,微妙可以向下精确到100纳秒。

使用DATETIME2数据类型你可以使用不同的长度字符存储和显示日期,从19(YYYY-MM-DD hh:mm:ss)到27(YYYY-MM-DD hh:mm:ss.0000000)。这依赖于不同数量的精度存储需要一定的磁盘开销。在DATETIME2列中存储不同的精度时需要在定义列时指定一个长度,我们可以像DATETIME2(X)来指定精度,其中X代表的是精度长度,可以从0到7。显示长度和存储空间的关系如下表所示:

图1

正如上表所示,DATETIME2列存储一个日期/时间值的磁盘空间开销是从6-8字节,它取决于你想要保留多少时间精度。

DATETIME2(3)格式等同于我们在旧版本的SQL Server中使用的DATETIME格式,但是使用DATETIME2(3)可以支持精确度到1毫秒,而旧版本中的DATETIME格式只能精确到 3.33毫秒。注意DATETIME2(3)只需要7字节的磁盘开销,而DATETIME格式需要8个字节,现在,这意味着你可以存储与较早发布的SQL Server相同的日期和时间值并且能够节省磁盘空间。

使用DATETIME(7)格式允许你存储日期类型向上精确到100纳秒,尽管增加了精度,但是你不能保证在一张表中的一个时间值是唯一的,当使用DATETIME(7)格式时仍然可能在同一张表中存储两条具有相同时间的不同的记录。

此处是一个如何使用DATETIME2不同的精度值来显示不同的时间格式:

DECLARE @D0 datetime2(0) = '2008-05-10 06:59:11.1234567';
DECLARE @D1 datetime2(1) = '2008-05-10 06:59:11.1234567';
DECLARE @D2 datetime2(2) = '2008-05-10 06:59:11.1234567';
DECLARE @D3 datetime2(3) = '2008-05-10 06:59:11.1234567';
DECLARE @D4 datetime2(4) = '2008-05-10 06:59:11.1234567';
DECLARE @D5 datetime2(5) = '2008-05-10 06:59:11.1234567';
DECLARE @D6 datetime2(6) = '2008-05-10 06:59:11.1234567';
DECLARE @D7 datetime2(7) = '2008-05-10 06:59:11.1234567';
PRINT @D0;
PRINT @D1;
PRINT @D2;
PRINT @D3;
PRINT @D4;
PRINT @D5;
PRINT @D6;
PRINT @D7;

当运行上述代码时将会得到如下结果:

2008-05-10 06:59:11
2008-05-10 06:59:11.1
2008-05-10 06:59:11.12
2008-05-10 06:59:11.123
2008-05-10 06:59:11.1235
2008-05-10 06:59:11.12346
2008-05-10 06:59:11.123457
2008-05-10 06:59:11.1234567

此处你可以看到,不同数量的精度显示不同的微秒,注意当我在DECLARE语句中设置默认值时DATETIME(4), DATETIME(5) 和DATETIME(6)做了一些舍入。

使用DATETIME2现在可以让你存在日期和时间在一列时有了更多的选择,现在如果你只想存储一个日期和精确到秒的时间,你可以使用DATETIME(0)来完成此需求而无需编写额外的代码以及浪费昂贵的磁盘开销。
你是否曾经想只存储日期而没有时间?如果是的话,使用旧的日期数据类型将无法完成。现在在SQL Server 2008中你可以使用DATE数据类型,DATE数据类型允许只存储一个日期值,它支持的日期范围从0001-01-01到9999-12-31,存储 DATE数据类型磁盘开销只需3个字节,如果你只需要存储日期值而没有时间,使用DATE可以比SMALLDATETIME节省一字节的磁盘空间。
这里用一个示例来展示如何显示DATE的值
SET NOCOUNT ON; DECLARE @D DATE = '2001-03-1'; PRINT @D; SELECT CONVERT(char(10),@D,120) DATEONLY, @D [DATE-N-TIME];

运行上述代码将会得到如下结果:
2001-03-01 DATEONLY DATE-N-TIME ---------- ----------------------- 2001-03-01 2001-03-01 00:00:00.000

这里你可以看到PRINT语句显示日期使用YYYY-MM-DD格式,但是SELECT语句要求你使用CONVERT函数把DATE变量转换为 YYYY-MM-DD格式,正如你所看到的,如果你使用SELECT只显示一个DATE变量,最后的输出结果仍然包含时间部分,这个功能在所有新的日期和时间数据类型中是一致的。

TIME

SQL Server 2008现在有了一个TIME数据类型,它允许你IC报价网只存储一个时间值而没有时间。如果想要存储一个特定的时间信息而不涉及具体的日期时,这将非常的有用。 TIME数据类型存储使用24小时制,它并不关心时区,支持高达100纳秒的精确度。TIME数据类型支持从0到7不同的精度,就像DATETIME2格式,它的磁盘开销是3到5个字节,取决与精度。TIME列的长度与精度如下表所示:

图1

此处是一个如何使用不同的DATETIME2精度值来显示不同的时间格式的示例:

DECLARE @T0 time(0) = '16:59:11.1234567';
DECLARE @T1 time(1) = '16:59:11.1234567';
DECLARE @T2 time(2) = '16:59:11.1234567';
DECLARE @T3 time(3) = '16:59:11.1234567';
DECLARE @T4 time(4) = '16:59:11.1234567';
DECLARE @T5 time(5) = '16:59:11.1234567';
DECLARE @T6 time(6) = '16:59:11.1234567';
DECLARE @T7 time(7) = '16:59:11.1234567';
PRINT @T0;
PRINT @T1;
PRINT @T2;
PRINT @T3;
PRINT @T4;
PRINT @T5;
PRINT @T6;
PRINT @T7;

当运行上述代码时将会得到如下结果:

16:59:11
16:59:11.1
16:59:11.12
16:59:11.123
16:59:11.1235
16:59:11.12346
16:59:11.123457
16:59:11.1234567

注意TIME(4),TIME(5)和TIME(6)在显示IC报价网时进行了精度截断,这与我们前面看到的DATETIME2的行为是一致的。只存储时间部分的TIME数据类型列现在允许我们验证SQL Server的时间值以确保它们包含的是有效的时间,并且能够节省空间。
DATETIMEOFFSET

IC报价网最后新的日期数据类型是DATETIMEOFFSET数据类型,此数据类型让你存储的日期和时间(24小时制)是时区一致的。时间部分能够支持如 DATETIME2和TIME数据类型那样的高达100纳秒的精度。DATETIMEOFFSET需要8到10字节的磁盘空间开销,这完全取决于你定义的时间部分的精度,如下表所示:

图1

时区一致是指时区标识符是存储在DATETIMEOFFSET列上,时区标识是代表了一个[-|+]hh:mm指定,一个有效的时区范围是从 -14:00到+14:00,这个值是增加或者减去UTC以获取本地时间。如需有关时间的转换,请参见“使用日期和时间”主题在联机丛书。

More Date and Time Choices

使用SQL Server 2008,现在有了更多的数据类型选择,可以用来存储你的日期和时间数据。你可以使用DATE数据类型只存储一个日期,或者TIME数据类型只存储一个时间值。在这些新的数据类型中时间部分现在支持的精度可以达到100纳秒。如果有需要存储日期需要与SQL Server的时区保持一致,可以使用DATETIMEOFFSET数据类型,有了这些新的日期/时间数据类型,你应该能够找到好的解决方案,以帮助你存储你的日期使用正确的格式而不需要写大量的自定义代码。

转载于:https://www.cnblogs.com/ph580/archive/2011/06/04/2072814.html

使用一下SQL Server 2008中的新日期函数相关推荐

  1. SQL Server 2008中原生的分层数据类型:hierarchyid

    SQL Server 2008中SQL应用系列--目录索引 如果是在SQL 2000中,我们需要读取分层结构数据时,不得不借助递归.在SQL server 2005中,我们可以使用CTE,当然,好的数 ...

  2. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008

    SQL Server 2008中Analysis Services的新特性 --深入SQL Server 2008 内容简介: 本书涵盖了SQL Server 2008引入的新功能.作者之一Rober ...

  3. SQL Server 2008中的Pivot和UnPivot

    SQL Server 2008中SQL应用系列--目录索引 今天给新成员讲解PIVOT 和 UNPIVOT示例,顺便整理了一下其用法.这是自SQL Server 2005起提供的新功能. 官方示例:h ...

  4. SQL Server 2008中的代码安全(四):主密钥

    SQL Server 2008中SQL应用系列--目录索引 在SQL Server中的加密由层次结构形式进行处理以提供多级别的安全.SQL Server包含两个用于加密数据的密钥类型.如下图: 1.服 ...

  5. SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月

    邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...

  6. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

    SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...

  7. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  8. 在SQL Server 2008中调用.net,dll

    T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查 ...

  9. SQL Server 2008中SQL之WaitFor

    SQL Server 2008中SQL应用系列--目录索引 在SQL Server 2005以上版本中,在一个增强的WaitFor命令,其作用可以和一个job相当.但使用更加简捷. 看MSDN: ht ...

最新文章

  1. 并发编程-单元练习题
  2. 计算机编程结构类型,运城计算机编程内存的概念与结构类型
  3. Verilog HDL程序设计——基本要素
  4. java html提取_2020年全新Java学习路线,含配套资料,更易上手 - 打不过就跑吧
  5. DeepLabv3+:语义分割领域的新高峰
  6. [2020-09-11 CQBZ/HSZX多校联测 T2] 泰拳警告(组合数+数学期望)
  7. 2 imwrite中文路径_如何为FreePBX/Asterisk配置中文语音支持
  8. 非空参数校验的工具类
  9. python里的百分号_python中的百分号
  10. 对比企业邮箱,使用企业邮箱有哪些好处?
  11. 搜索引擎开源代码(转)
  12. 微信小程序账号注册初始化环境搭建
  13. 美颜SDK是什么?免费的美颜SDK源码有吗?
  14. presson绘图练习
  15. 从维基百科复制数学公式
  16. 使用Yoast SEO提交Sitemap
  17. i5 1135G7和R5 5600H 选哪个好
  18. Oracle解决监听问题:OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。
  19. Mac 下终端命令无法使用
  20. 浏览器查看当前网页的源码:view-source

热门文章

  1. linux系统atom安装教程,Ubuntu/Linux Mint上安装Atom文本编辑器
  2. java socket调用接口_java调用websocket接口
  3. java计算距离_java实现计算地理坐标之间的距离
  4. flink java 并行度_flink solt和并行度
  5. 《零基础》MySQL DELETE 语句(十五)
  6. 论java中可变参数
  7. mysql 数据库中数据去重,oracle数据库中如何达到像mysql数据库中group by 那种去重的效果..求大神解答...
  8. android 照片特效,android触摸时扭曲变形图片照片,图片特效
  9. Spring Boot application.properties 常用配置
  10. python实例 83,84