
文章插图
一,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:占用两个字节,表示对午夜之后的始终滴答数
【你不知道的SQL Server 日期和时间的内部存储过程】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;

文章插图
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;
在探索DateTime2(n)的内部存储之前,先了解一下字节存储的“小端”格式和“大端”格式:
- 大端格式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
- 小端格式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中 。
- 如果采用大端格式:字节序列是0x0113
- 如果采用小端格式:字节序列是0x1301
2,DateTime2的存储格式
DateTime2(n)的内部存储格式是:
- 第一字节存储的精度n,
- 后三个字节记录从基准日期0001-01-01之后的多少天,采用小端格式 。
- 中间余下的字节记录子夜之后经过的时间单位间隔(time unit interval,TUI)的数量,采用小端格式 。
- 对于 DateTime2(7),TUI是100ns;
- 对于 DateTime2(6),TUI是1微秒(=1000ns);
- 对于 DateTime2(5),TUI是10微秒;
- 对于 DateTime2(4),TUI是100微秒;
- 对于 DateTime2(3),TUI是1ms(1毫秒=1000微秒);
2,把DateTime2转换为二进制存储
推荐阅读
- 漫说金坛历代先贤结下的茶缘
- 你的手机连接是WiFi,还是WLAN?这两者有什么区别呢
- Ping命令的7个基础用法,掌握了秒变大神
- 如何编写awk命令和脚本
- 通过CSS注入窃取HTML中的数据
- 简单聊聊HTTP2.0中的Server Push
- centos8使用python3自带的venv创建虚拟环境报错问题
- 音频压缩编码的基本原理详解
- PING命令详解,端到端的延时测试工具
- 你应该学会的 bigcache 优化技巧
