您的位置:首页 > 数据库

sql 2005 日期时间 数据类型

2013-04-19 15:59 295 查看
数据类型范围精确度
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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: