数据类型——日期时间

 

数据类型 范围 精确度
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)
SET @value = '20100625 21:12:51:001'

SELECT CONVERT(DATETIME,@value) 
SELECT CAST(@value AS DATETIME)
--2010-06-25 21:12:51.000   注意这里毫秒位置变为了000

SELECT CAST(@value AS SMALLDATETIME)
--2010-06-25 21:13:00       注意这里分钟不是12

取整的原则
舍入到最近的可以被表示的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)
SELECT CAST(CONVERT(CHAR(8),GETDATE(),112)AS DATETIME)

--2010-06-25 00:00:00.000

 

你可能感兴趣的:(sql,server,calendar,Microsoft,Sybase,存储,2010)