mysql 2008 日_SQL2008 的 日期数据类型

摘要

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

e7d128aa065cb5f381a05ef3396a7057.png

正如上表所示,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列的长度与精度如下表所示:

85d094218cb1c238d3df8e60b64ece47.png

此处是一个如何使用不同的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字节的磁盘空间开销,这完全取决于你定义的时间部分的精度,如下表所示:

5230dc191ab557d61e951d5780b24a55.png

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别了,JavaScript;你好,Blazor

Web开发与JavaScript开发向来是同义词。直到WebAssembly的横空出世,WebAssembly (Wasm)是一种在浏览器中可以执行的二进制指令。WebAssembly 的 官方工具链 能够编译 C/C 代码,但许多社区也提供了不同语言的编译器,如 Rust,Python…

[Java基础]接口组成(默认方法,静态方法,私有方法)

默认方法: 代码如下: package MyInterfacePack;public interface MyInterface {void show1();void show2();// void show3();public default void show3(){System.out.println("show3");};}package MyInterfacePack;public class MyInterfaceImplOne implements …

linux jdk1.7 tomcat mysql_Linux环境搭建 jdk+tomcat+mysql

好久之前搭建的,现在记录下 防止下次配置去找安装jdk(jre也行),tomcat MySQL一、jdk安装及环境变量配置:我是用 jdk-8u191-linux-x64.tar.gz 安装的安装之前提前下载好 jdk版本 看你用什么版本吧 都一样的步骤 按照下面的步骤操作 要确保完全是一个新环境…

Eight HDU - 1043(八数码+搜索)

题意: 就是还原八数码。输出操作。 题目: The 15-puzzle has been around for over 100 years; even if you dont know it by that name, youve seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and all …

开源 一套 Blazor Server 端精致套件

Blazor 作为一种 Web 开发的新技术已经发展有一段时间了,有些人标称 无 JS 无 TS,我觉得有点误导新人的意味,也有人文章大肆宣传 Blazor 是 JavaScript 的终结者,是为了替代 JavaScript 而生的,我认为这些言论都太激进…

[Java基础]函数式接口

代码如下: package MyInterfacePack01;FunctionalInterface public interface MyInterface {void show(); }package MyInterfacePack01;public class MyInterfaceDemo {public static void main(String[] args){MyInterface my ()->System.out.println("hello world&q…

mysql单库用户隔离_Mysql数据库隔离级别

数据库事务四大特性(ACID)原子性(Atomicity)原子性是指事务中的操作要么全部成功,要么失败回滚。一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转…

Tree Cutting POJ - 2378(树形DP)

题意:有n个谷仓有n-1条路连接,问最少删除哪几个点才能使得删除点后得到的连通图的加点数不大于n/2. 分析:求树的重心的变形题,poj3107的简单版,一遍dfs从叶子到根转移找出找到以每个节点为根的子树的结点数&#xff0…

从零搭建分布式文件系统MinIO比FastDFS要更合适

前两天跟大家分享了一篇关于如何利用FastDFS组件来自建分布式文件系统的文章,有兴趣的朋友可以阅读下《用asp.net core结合fastdfs打造分布式文件存储系统》。通过留言发现大家虽然感兴趣,但是都觉得部署比较麻烦。的确,fastdfs的部署很繁琐&…

ember.js mysql_用AWS部署ember.jspadrino应用系列之一

aws提供了一年免费试用服务。这里,记录下,配置aws和部署开源cms程序——维卡币操盘手的整个过程。主要内容包括:EC2实例的创建和设置——ruby环境和nginx配置,部署ruby应用。RDS实例的创建和使用——mysql数据库参数组的使用。S3库…

[Java基础]方法引用

代码如下: package PrintablePack;public interface Printable {void printString(String s);}package PrintablePack;public class PrintableDemo {public static void main(String[] args){usePrintable(s-> System.out.println(s));usePrintable(System.out::println);/…

Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)

题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和。 解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行。 Tim…

甲方爸爸,大概你要的是代码生成器吧?

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!一1)有一天,我的朋友Y童鞋分享了他正在做的一个内部开源项目,这个开源项目从外表上看,跟目前市场上那些代码生成器本没有特别…

使用pdf.js来预览pdf文件_适用于Dynamics365与PowerApps的注释预览组件

powerapps/dynamics365适用的注释预览/批量下载组件自定义组件为预览功能原生预览支持的文件类型:图像,zip,音频,pdf支持批量打包注释为zip下载到本地使用浏览器预览支持:音频,视频,图像,pdf,文本,xml,json等,理论上只需要浏览器支持打开的文件类型,均可预览使用方法:1.导入解决…

[PAT乙级]1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n1。卡拉兹在 1950 年的世界数学家大会上公布了…

Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)

题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit 3000 ms OS Linux George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return st…

消息队列,我只选RabbitMQ!

高并发架构是架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石。作为专注.NET领域十多年的老架构师,下面从队列本质、技术选型、实战应用三个方面&#xf…

python比较三个数_python经典练习题(三)

人生苦短,你需要python继续学习python第一题题目:输入三个整数 x,y,z,请把这三个数由小到大输出不借助sortnum1 int(input("请输入第一个数"))num2 int(input("请输入第二个数"))num3 int(input("请输入第三个数&qu…

[PAT乙级]1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10​100​​。 输出格式: 在一行内输出 n 的各位数字之和的…