数据类型 | 范围 | 精确度 |
DATETIME | 1753年1月1日至9999年12月31日 | 3.33毫秒 |
SMALLDATETIME | 1900年1月1日至2079年6月6日 | 1分钟 |
1753的由来:
这个限制来源于历史原因.
历史上,在西方有两种历法制度:
儒略历(Julian calendar)
格里历(Gregorian calendar)
二种历法对于同一天的记法,相差10到13天。所以,两种历法转换时,需要计算差值。
1752年,英国对历法进行了统一转换。 (在这一年的,1752-9-2日的下一天是1752-9-14)。
如果存储1753年之前的日期,必须说明是哪种历法制度,才能够得到准确的时间日期。
所以,Sybase及MicroSoft SQL Server都1753年最为最早的日期。(有根据的猜测)
存储格式
与1900-1-1相差的天数 | 从午夜0点开始 | 长度 | |
DATETIME | 4字节 | 4字节 [以3.333毫秒为单位的时间] | 8字节 |
SMALLDATETIME | 2字节 | 2字节 [以分钟为单位] | 4字节 |
[取整问题]
由于DATETIME百分之三秒以及SMALLDATETIME分钟的单位限制。导致字符串与日期时间类型转换时,会发生取整问题。
例如:
DECLARE @value VARCHAR(20) SELECT CONVERT(DATETIME,@value) SELECT CAST(@value AS SMALLDATETIME) |
取整的原则
舍入到最近的可以被表示的DATETIME值。
毫秒部分的匹配规则为:[0-9][0-9][037]
0,1 舍入为0 || 2,3,4舍入为3 || 5,6,7,8舍入为7 || 9舍入为0
因为毫秒位的[999]会被舍入为1.000,所以,利用时间限定数据提取范围时,请使用下面的推荐形式:
WHERE dt >= '20100625 00:00:00.000' AND dt < '20100626 00:00:00.000' |
SQL2005未分离的日期和时间
SQL2005没有单独的提供时间或日期的数据类型。单独获取日期需要用到以下方法:
SELECT DATEADD(d,DATEDIFF(d,0,GETDATE()),0) --2010-06-25 00:00:00.000 |