数据类型——日期时间

 

数据类型范围精确度
DATETIME1753年1月1日至9999年12月31日3.33毫秒
SMALLDATETIME1900年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点开始长度
DATETIME4字节4字节   [以3.333毫秒为单位的时间]8字节
SMALLDATETIME2字节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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值