摘要

你是否曾经想在数据库中存储一个日期而没有时间部分,或者想存储一个时间值希望有更高的精度?在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。显示长度和存储空间的关系如下表所示:

正如上表所示,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)来完成此需求而无需编写额外的代码以及浪费昂贵的磁盘开销。

DATE

你是否曾经想只存储日期而没有时间?如果是的话,使用旧的日期数据类型将无法完成。现在在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数据类型,它允许你只存储一个时间值而没有时间。如果想要存储一个特定的时间信息而不涉及具体的日期时,这将非常的有用。TIME数据类型存储使用24小时制,它并不关心时区,支持高达100纳秒的精确度。TIME数据类型支持从0到7不同的精度,就像DATETIME2格式,它的磁盘开销是3到5个字节,取决与精度。TIME列的长度与精度如下表所示:

此处是一个如何使用不同的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)在显示时进行了精度截断,这与我们前面看到的DATETIME2的行为是一致的。只存储时间部分的TIME数据类型列现在允许我们验证SQL Server的时间值以确保它们包含的是有效的时间,并且能够节省空间。

DATETIMEOFFSET

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

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

总结

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

mysql 2008 日_SQL2008 的 日期数据类型相关推荐

  1. 使用一下SQL Server 2008中的新日期函数

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

  2. MySQL日期数据类型、时间类型使用总结

    转载链接:http://www.jb51.net/article/23966.htm MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ----- ...

  3. mysql 日期的数据类型,MySQL日期数据类型、MySQL时间类型使用总结

    摘要 腾兴网为您分享:MySQL日期数据类型.MySQL时间类型使用总结,政务易,悬浮球,网赚招聘,社会扶贫等软件知识,以及水星mw150us,街机123,脉脉app,安卓优化大师hd,优声,uc订阅 ...

  4. mysql的datetime使用_​MySQL日期数据类型datetime的使用方法

    ​MySQL日期数据类型datetime的使用方法 发布时间:2020-11-13 14:16:23 来源:亿速云 阅读:86 作者:小新 这篇文章将为大家详细讲解有关MySQL日期数据类型datet ...

  5. mysql time类型解析_mysql时间数据类型解析

    1.MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比 ...

  6. mysql当前日期减去天数_mysql日期函数-日期相减返回天数

    一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +-------------------- ...

  7. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  8. SQL Server日期数据类型DATE的使用

    在SQL Server 较高版本,如SQL 2008新增加了一个日期数据类型DATE,它很容易地帮Insus.NET解决一个问题. 专案中需要做每天的报表,即是说要搜索出每天的记录.比如用户输入某一天 ...

  9. Mysql生产指定时间段随机日期函数

    Mysql生产指定时间段随机日期函数 UPDATE basicsale_b2b2c.basic_customer SET registerDate = (from_unixtime(unix_time ...

最新文章

  1. 再译《A *路径搜索入门》之一
  2. 高效工作,分享几个实用的小诀窍,很多人已经悄悄用上了
  3. 121 Best Time to Buy and Sell Stock 买卖股票的最佳时机
  4. centos7 怎么封装自己的镜像_「10」-CentOS7.5(1804)
  5. 硬盘突然提示没有初始化_测试流程_507283-001 硬盘 HP SAS
  6. PYTHON之路(八)
  7. 自定义UINavigationBar的背景【转】
  8. mongodb修改最大连接数
  9. 平纹、斜纹、缎纹是什么?各自有何特点?
  10. NO5 grep-head-tail命令
  11. Ulipad快捷键大总结
  12. 【真正离线安装】Adobe Flash Player 32.0 插件离线安装包下载(无需联网安装)
  13. CINTA:陪集与拉格朗日定理
  14. 2021-01-01 中国公务员级别
  15. unsupported pickle protocol: 5
  16. 应用软件安装后在注册表中生成的安装信息、卸载信息
  17. 关于阿里云服务器ECS与域名的绑定详细过程介绍
  18. 鼠标点击器20+版本使用教程系列(2)多位置循环点击器
  19. geotrust通配符证书
  20. 弘辽科技:商家开店的过程中常犯违规汇总。

热门文章

  1. linux之dos2unix命令解决vi打开文件行尾巴显示^M
  2. 【iVX 初级工程师培训教程 10篇文拿证】07 08 新闻页制作
  3. 你所阅读的,决定你是什么样的人
  4. 10分钟让你快速掌握Excel的16项重要技巧
  5. PL/SQL Developer使用技巧总结
  6. 宝塔linux面板假设nextcloud,宝塔面板部署NextCloud(14.0.3)逐一解决后台安全及设置警告...
  7. react dispatch_React测试的那些事(三) React Hook 测试实例
  8. linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)
  9. 参加计算机竞赛需要学什么知识,数学和计算机专业,我应该参加那些比赛?
  10. java jdk win10安装_Java 安装 JDK WIN10