在SQL Server的内部存储中、日期和时间不是以字符串的形式存储的,而是使用整数来存储的。使用特定的格式来区分日期部分和时间部分的偏移量,并通过基准日期和基准时间来还原真实的数据。
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 & # 8260;300秒,精确度为3.33毫秒(0.00333秒,3.33 ms),因此,DateTime能够表示的时间,可能会存在一个滴答的时间误差。
DateTime的内部存储格式,用十六进制表示是:DDDDTTTT
-
<李> DDDD:占用2个字节,表示对基准日期的偏移量李>
<李> TTTT:占用两个字节,表示对午夜之后的始终滴答数李>
举个例子,对于如下的日期和时间,把DateTime类型转换为大小为8个字节的16进制,每两个数字对应1个字节:
声明@dt datetime=' 2015-05-07 10:05:23.187 ' 选择转换(varbinary (8)、@dt) date_time_binary 之前,输出0 x0000a49100a6463c >1,拆分出日期和时间
把时间的二进制格式中的字节拆分成两部分:前4个字节表示日期,后4个字节表示,得出的结果如下:
声明@dt datetime=' 2015-05-07 10:05:23.187 ' 选择子串(转换(varbinary (8), @dt), 1、4) date_binary, 铸造(substring(转换(varbinary (8), @dt), 1、4) int) date_int, substring(转换(varbinary (8), @dt), 5、4) time_binary, 铸造(substring(转换(varbinary (8), @dt), 5、4) int) time_int;,
2,通过偏移量还原日期和时间
通过基准时间和偏移量,把整数还原为原始的日期和时间:
声明@Time时间=' 00:00:00.000 ' 声明@Date日期=' 1900-01-01 ' 选择返回(42129年一天,@Date) originl_date 返回(女士,10896956 * 10/3,@Time)作为original_time
DateTime2 (n)数据类型存储日期和时间,它是DateTime的升级版本,由于小数秒n的精度可以自主设置,其存储大小(存储大小)不固定,DateTime2 (n)占用的存储空间和小数秒的精度之间的关系是:
-
<李> DateTime2 (n)内部存储的第一个字节存储精度n,后续的字节用于存储日期和时间的值。李>
<李>当小数秒的精度n & lt;3时,总的存储空间是1 B(精度)+ 6 B(数据);李>
<李>当小数秒的精度n是3 - 4时,总的存储空间是1 b(精度)+ 7 b(数据);李>
<李>当小数秒的精度n是5 - 7时,总的存储空间是1 b(精度)+ 8 b(数据),最大的小数秒精度是7,默认值是7,李>
1,二进制逆序
在探索DateTime2 (n)的内部存储之前,先了解一下字节存储的“小端”格式和“大”端格式:
-
<李>大端格式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中,李>
<李>小端格式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
李>
举个例子,假如内存地址左边是地位,右边是高位,对于数275字,使用两个字节来存储:
-
<李>如果采用大端格式:字节序列是0 x0113李>
<李>如果采用小端格式:字节序列是0 x1301
李>
DateTime2 (n)的内部存储格式使用的是小端格式,这种格式适合CPU的运算。
2, DateTime2的存储格式
DateTime2 (n)的内部存储格式是:
-
<李>第一字节存储的精度n,李>
<李>后三个字节记录从基准日期0001-01-01之后的多少天,采用小端格式。李>
<李>中间余下的字节记录子夜之后经过的时间单位间隔(时间单位间隔,途易)的数量,采用小端格式。李>
退是由精度来控制的,每一个途易是10的n次方之一秒,也就是:
-
<李>对于DateTime2(7),途易是100 ns;李>
<李>对于DateTime2(6),途易微是1秒(=1000 ns);李