把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

文章插图
把二进制值拆分成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;

文章插图
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
推荐阅读
- 漫说金坛历代先贤结下的茶缘
- 你的手机连接是WiFi,还是WLAN?这两者有什么区别呢
- Ping命令的7个基础用法,掌握了秒变大神
- 如何编写awk命令和脚本
- 通过CSS注入窃取HTML中的数据
- 简单聊聊HTTP2.0中的Server Push
- centos8使用python3自带的venv创建虚拟环境报错问题
- 音频压缩编码的基本原理详解
- PING命令详解,端到端的延时测试工具
- 你应该学会的 bigcache 优化技巧
