SQL Server日期和时间的内部存储过程

  

在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;      

,  SQL Server日期和时间的内部存储过程

  

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

  

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

        声明@Time时间=' 00:00:00.000 '   声明@Date日期=' 1900-01-01 '      选择返回(42129年一天,@Date) originl_date   返回(女士,10896956 * 10/3,@Time)作为original_time      

 SQL Server日期和时间的内部存储过程

  


  

  

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次方之一秒,也就是: