您当前的位置:首页 > 电脑百科 > 数据库 > SQL Server

你不知道的SQL Server 日期和时间的内部存储过程

时间:2019-12-19 15:33:04  来源:  作者:

你不知道的SQL Server 日期和时间的内部存储过程

一,DateTime的内部存储

SQL Server存储引擎把DateTime类型存储为2个int32类型,共8个字节,第一个int32 整数(前4个字节)存储的是日期相对于基准日期(1900-01-01)的偏移量。基准日期是1900-01-01,当前4 字节为0 时,表示的日期是1900 年1 月1 日。第二个int32整数(后4个字节)存储的是午夜(00:00:00.000)之后的时钟滴答数,每个滴答为1⁄300秒,精确度为3.33毫秒(0.00333秒,3.33ms),因此,DateTime能够表示的时间,可能会存在一个滴答的时间误差。

DateTime的内部存储格式,用十六进制表示是:DDDDTTTT

  • DDDD:占用2个字节,表示对基准日期的偏移量
  • TTTT:占用两个字节,表示对午夜之后的始终滴答数

举个例子,对于如下的日期和时间,把DateTime类型转换为大小为8个字节的16进制,每两个数字对应1个字节:

declare @dt datetime = '2015-05-07 10:05:23.187'

select convert(varbinary(8), @dt) as date_time_binary

--output 0x0000A49100A6463C

1,拆分出date和time

把时间的二进制格式中的字节拆分成两部分:前4个字节表示date,后4个字节表示time,得出的结果如下:

declare @dt datetime = '2015-05-07 10:05:23.187'

 

select substring(convert(varbinary(8), @dt), 1, 4) as date_binary,

cast(substring(convert(varbinary(8), @dt), 1, 4) as int) as date_int,

substring(convert(varbinary(8), @dt), 5, 4) as time_binary,

cast(substring(convert(varbinary(8), @dt), 5, 4) as int) as time_int;

你不知道的SQL Server 日期和时间的内部存储过程

2,通过偏移量还原日期和时间

通过基准时间和偏移量,把整数还原为原始的日期和时间:

declare @Time time='00:00:00.000'

declare @Date date='1900-01-01'

select dateadd(day, 42129, @Date) as originl_date

, dateadd(ms,10896956*10/3, @Time) as original_time

二,DateTime2的内部存储

DateTime2(n)数据类型存储日期和时间,它是DateTime的升级版本,由于小数秒n的精度可以自主设置,其存储大小(Storage Size)不固定,DateTime2(n)占用的存储空间和小数秒的精度之间的关系是:

  • DateTime2(n)内部存储的第一个字节存储精度n,后续的字节用于存储日期和时间的值。
  • 当小数秒的精度 n < 3 时,总的存储空间是1B(精度)+6 B(数据);
  • 当小数秒的精度 n 是 3 - 4 时,总的存储空间是1B(精度)+ 7B(数据);
  • 当小数秒的精度 n 是 5 - 7 时,总的存储空间是1B(精度)+ 8B(数据),最大的小数秒精度是7,默认值是7;

1,二进制逆序

在探索DateTime2(n)的内部存储之前,先了解一下字节存储的“小端”格式和“大端”格式:

  • 大端格式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
  • 小端格式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

举个例子,假如内存地址左边是地位,右边是高位,对于数字275,使用两个字节来存储:

  • 如果采用大端格式:字节序列是0x0113
  • 如果采用小端格式:字节序列是0x1301

DateTime2(n)的内部存储格式使用的是小端格式,这种格式适合CPU的运算。

2,DateTime2的存储格式

DateTime2(n)的内部存储格式是:

  • 第一字节存储的精度n,
  • 后三个字节记录从基准日期0001-01-01之后的多少天,采用小端格式。
  • 中间余下的字节记录子夜之后经过的时间单位间隔(time unit interval,TUI)的数量,采用小端格式。

TUI是由精度来控制的,每一个TUI是10的n次方之一秒,也就是:

  • 对于 DateTime2(7),TUI是100ns;
  • 对于 DateTime2(6),TUI是1微秒(=1000ns);
  • 对于 DateTime2(5),TUI是10微秒;
  • 对于 DateTime2(4),TUI是100微秒;
  • 对于 DateTime2(3),TUI是1ms(1毫秒=1000微秒);

为了便于运算,把DateTime2(n) 的字节流逆序排列:前3个字节表示的是天数,最后一个字节表示的是精度,中间余下的字节表示的TUI的数量。例如,对于 DateTime2(7)按照字节流逆序处理之后,存储空间是9个字节:前三个字节是存储的从基准日期0001-01-01之后的多少天,最后一位是精度n,中间的5个字节表示从子夜开始有多少个TUI。

2,把DateTime2转换为二进制存储

把DateTime2转换为二进制存储,并作逆序处理,DateTime2(3)的精度为3,存储空间是8个字节,后三个字节记录从基准日期0001-01-01之后的多少天,前3个字节表示从子夜开始有多少个TUI。

declare @dt datetime2(3)='2015-05-07 10:05:23.187'

declare @dt_bi varbinary(max)=convert(varbinary(max), @dt)

select @dt_bi as date_time_binary

,convert(varbinary(max),reverse(@dt_bi)) as reverse_binary

你不知道的SQL Server 日期和时间的内部存储过程

把二进制值拆分成DateTime2(3)的各个组成成分:

declare @dt datetime2(3)='2015-05-07 10:05:23.187'

declare @dt_bi varbinary(max)=convert(varbinary(max), @dt)

declare @dt_bi_littleEnd varbinary(max)

select @dt_bi_littleEnd=convert(varbinary(max),reverse(@dt_bi))

 

select substring(convert(varbinary(8), @dt_bi_littleEnd), 1, 3) as date_binary,

cast(substring(convert(varbinary(8), @dt_bi_littleEnd), 1, 3) as int) as date_int,

substring(convert(varbinary(8), @dt_bi_littleEnd), 4, 4) as time_binary,

cast(substring(convert(varbinary(8), @dt_bi_littleEnd), 4, 4) as int) as time_int,

substring(convert(varbinary(8), @dt_bi_littleEnd), 8, 1) as precision_binary,

cast(substring(convert(varbinary(8), @dt_bi_littleEnd), 8, 1) as int) as precision_int;

你不知道的SQL Server 日期和时间的内部存储过程

3,利用偏移量和基准还原原始值

有了偏移量,就可以在基准日期和时间之上加上偏移量来获得原始值:

declare @Time time='00:00:00.000'

declare @Date date='0001-01-01'

select dateadd(day, 735724, @Date) as originl_date

, dateadd(ms,36323187, @Time) as original_time



Tags:SQL Server   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
介绍一个SQL Server 2016后新增的功能:查询存储。查询存储的工作原理类似于飞行数据记录器或者黑匣子,不断地收集与查询和计划相关的编译和运行时信息,包括已执行查询的历史记...【详细内容】
2021-08-17  Tags: SQL Server  点击:(65)  评论:(0)  加入收藏
众所周知SQL SERVER是微软的数据库拳头产品,有着图形化友好界面、操作门槛低、部署难度小,一键式安装的特点,受到全球开发者及企业的青睐。从历代版本说起,经典2000版本是划时代...【详细内容】
2021-07-19  Tags: SQL Server  点击:(90)  评论:(0)  加入收藏
要想看懂存储过程的意思,就必须要多看存储过程和实例,多百度查询前人的积累的说明,只有在不断地实践才能形成自己的知识,首先,先看到一些基础的语法,慢慢就看懂存储过程说表达的意...【详细内容】
2021-05-14  Tags: SQL Server  点击:(177)  评论:(0)  加入收藏
在SQL server应用开发过程中,可能会遇到ntext、text 和 image 三种数据类型,这三种数据类型是做什么的,有什么区别呢?下面表格从存储类型、存储数据的最大长度和存储大小三个维...【详细内容】
2021-04-26  Tags: SQL Server  点击:(232)  评论:(0)  加入收藏
在数据库使用过程中,为了数据的安全,除了通过服务器防火墙设置访问权限外,还可以通过在数据库中通过创建触发器的方式来控制用户或特定IP的登录权限。USE master;创建数据库登...【详细内容】
2021-04-23  Tags: SQL Server  点击:(219)  评论:(0)  加入收藏
文章来源:https://mp.weixin.qq.com/s/pEXio0MNoi1k0w9XgYECNw作者:廖学强 1. sqlserver查看实例级别的信息,使用SERVERPROPERTY函数select SERVERPROPERTY (&#39;propertyname...【详细内容】
2021-01-12  Tags: SQL Server  点击:(188)  评论:(0)  加入收藏
因工作需要,长期用到Microsoft SQL Server,很多人还不知道怎么安装和配置这个Microsoft SQL Server,今天我就从头到尾来安装一遍,用截图软件截下图来打上文字或者画上箭头来标示...【详细内容】
2020-09-15  Tags: SQL Server  点击:(109)  评论:(0)  加入收藏
Legal informations for Sage, depending on each country. Address. 修改数据库环境的排序规则登录数据库后,查看当前安装数据库默认排序规则的两种方式方式一、使用SQL S...【详细内容】
2020-08-10  Tags: SQL Server  点击:(213)  评论:(0)  加入收藏
因为发展需求,公司使用了OSI 公司的 PI 系统对于PI系统没有深入的了解,只是根据供应商的资料学习了一些基本内容,因为这个pi系统是从底层DCS 收集数据,然后再在第三方客户端程序...【详细内容】
2020-08-04  Tags: SQL Server  点击:(109)  评论:(0)  加入收藏
本文描述了SQL Server中存储过程和用户定义函数之间的区别。存储过程(Stored Procedure)存储过程只不过是您事先保存好的SQL代码而已,您可以反复使用该代码。 如果您一遍又一...【详细内容】
2020-06-26  Tags: SQL Server  点击:(159)  评论:(0)  加入收藏
▌简易百科推荐
概述我们知道SQL Server是微软公司推出的重要的数据库产品,通常情况下只支持部署在windows平台上。不过令人感到兴奋的是,从SQL Server 2017开始支持 linux系统。此 SQL Serve...【详细内容】
2021-12-17  雪竹聊运维    Tags:SQLSERVER   点击:(13)  评论:(0)  加入收藏
介绍一个SQL Server 2016后新增的功能:查询存储。查询存储的工作原理类似于飞行数据记录器或者黑匣子,不断地收集与查询和计划相关的编译和运行时信息,包括已执行查询的历史记...【详细内容】
2021-08-17  哈囉克里    Tags:SQL Server   点击:(65)  评论:(0)  加入收藏
众所周知SQL SERVER是微软的数据库拳头产品,有着图形化友好界面、操作门槛低、部署难度小,一键式安装的特点,受到全球开发者及企业的青睐。从历代版本说起,经典2000版本是划时代...【详细内容】
2021-07-19  风影互联    Tags:SQL SERVER   点击:(90)  评论:(0)  加入收藏
要想看懂存储过程的意思,就必须要多看存储过程和实例,多百度查询前人的积累的说明,只有在不断地实践才能形成自己的知识,首先,先看到一些基础的语法,慢慢就看懂存储过程说表达的意...【详细内容】
2021-05-14  ITLIFEMAN    Tags:sql server   点击:(177)  评论:(0)  加入收藏
在SQL server应用开发过程中,可能会遇到ntext、text 和 image 三种数据类型,这三种数据类型是做什么的,有什么区别呢?下面表格从存储类型、存储数据的最大长度和存储大小三个维...【详细内容】
2021-04-26  数据超酷  今日头条  Tags:SQL Server   点击:(232)  评论:(0)  加入收藏
在数据库使用过程中,为了数据的安全,除了通过服务器防火墙设置访问权限外,还可以通过在数据库中通过创建触发器的方式来控制用户或特定IP的登录权限。USE master;创建数据库登...【详细内容】
2021-04-23  数据超酷  今日头条  Tags:SQL Server   点击:(219)  评论:(0)  加入收藏
今天给大家梳理Apply关键字用法,希望对大家能有所帮助!1、概念介绍APPLy关键字是SQLServer版本中开始提供的一个系统关键字。APPLY的功能同联接很类似,APPLY运算分左右两个部...【详细内容】
2021-04-16    数据库技术分享社区  Tags:Apply关键字   点击:(217)  评论:(0)  加入收藏
文章来源:https://mp.weixin.qq.com/s/pEXio0MNoi1k0w9XgYECNw作者:廖学强 1. sqlserver查看实例级别的信息,使用SERVERPROPERTY函数select SERVERPROPERTY (&#39;propertyname...【详细内容】
2021-01-12      Tags:SQL Server   点击:(188)  评论:(0)  加入收藏
作为程序员来说,与数据库打交道是十分频繁的分页查询是一个开发者必须掌握的基本知识点,目前整理了下面三种SQLServer分页查询语句的写法,仅供参考。一、Top Not IN 方式(查询...【详细内容】
2020-12-29      Tags:分页查询   点击:(174)  评论:(0)  加入收藏
因工作需要,长期用到Microsoft SQL Server,很多人还不知道怎么安装和配置这个Microsoft SQL Server,今天我就从头到尾来安装一遍,用截图软件截下图来打上文字或者画上箭头来标示...【详细内容】
2020-09-15      Tags:SQL Server2000   点击:(109)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条