本文目录列表:



1、SQL Server中的基准日期



2smalldatetime的日期范围



3、smalldatetime的日期范围和无符号2字节整数的关系



4、总结语



5、参考清单列表



 



SQL Server中的基准日期



 



SQL Server 中针对datetime和smalldatetime这两个日期时间数据类型提供一个基准日期,也就是1900-01-01。



以下摘录自MSDN



SQL Server 2005 数据库引擎用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储“基础日期”(即 1900 年 1 月 1 日)之前或之后的天数。基础日期是系统参照日期。另外一个 4 字节存储天的时间,以午夜后经过的 1/300 秒数表示。

smalldatetime 数据类型存储天的日期和时间,但精确度低于 datetime。数据库引擎将 smalldatetime 值存储为两个 2 字节的整数。第一个 2 字节存储 1900 年 1 月 1 日后的天数。另外一个 2 字节存储午夜后经过的分钟数。

注意:

1、以上“基础日期”(即1900年1月1日)也就是本文要说的基准日期。

 



smalldatetime的日期范围



smalldatetime的日期范围 根据msdn中相关资料是[1900-01-01,2079-06-06]。



 



smalldatetime的日期范围和无符号2字节整数的关系



 



SQL Server针对datetime和smalldatetime的数据类型的变量或字段列赋值为0或1900-01-01,其结果是相同的。



以下T-SQL代码效果如下:




 



 

SQL SERVER 日期 每天 sqlserver日期范围_数据类型


smalldatetime日期的最大值为2079-06-06,如果针对该数据的赋值为65535 (该值为 无符号2字节整数的最大值2^16-1),结果也是为2079-06-06的,以下T-SQL代码效果如下:


 

SQL SERVER 日期 每天 sqlserver日期范围_SQL_02


从0对应1900-01-01,65535对应2079-06-06其对应关系,大致可以得到smalldatetime的日期范围和无符号2字节整数的范围正好一一对应的。可以通过T-SQL得到证明,如下:


SQL SERVER 日期 每天 sqlserver日期范围_SQL_03


SQL SERVER 日期 每天 sqlserver日期范围_SQL SERVER 日期 每天_04


注意:


1、中间省略了部分,仅显示头和尾的数据对应,中间省略。


2、函数dbo.ufn_GetNums可以参看SQL Server数字辅助表的实现


 


总结语


 


smalldatetime的日期范围是和无符号2字节整数的范围一一对应的。针对这种对应关系,如果数据表中的字段列为日期时间数据类型,且精度为天,就可以保存一个整数和该日期保存一种对应关系,可以参考基准日期1900-01-01做起点映射,当然也可以选择其他的日期,当然也考虑相应的日期时间数据类型的范围的。


 


参考清单列表


1、 https://technet.microsoft.com/zh-cn/library/ms187819(v=sql.90).aspx