日期:2014-05-16  浏览次数:20514 次

ISDATE函数对于1753年之前的日期都返回0

今天看到一个帖子,将1753年之前的一个日期用ISDATE函数会返回0,自己也做了多个测试,发现确实如此:

 

declare @date asdate

 

set @date =convert(date,'17000101')

 

print @date  --可以转化为Date类型

 

print ISDATE('17000101')

 

结果确实返回0:

 

1700-01-01
0


 

后来看到有人提到可能跟SQL Server日期的存储范围,查了一下MSDN发现:

 

datetim的日期范围:

 

日期范围

1753 年 1 月 1 日到 9999 年 12 月 31 日

 

所以日期范围是从1753年之后开始,所以1753年之前的用ISDATE都会返回0,但是搞不懂为什么还可以转化成DATE字符型呢?

 

Datetime2扩大了日期范围,可以存储0001年之后的日期:

 

日期范围

0001-01-01 到 9999-12-31

公元元年 1 月 1 日到公元 9999 年 12 月 31 日

 

但是使用ISDATE是有限制的,如果 expression 是有效的datetimedatetime 值,则返回 1;否则,返回 0。如果expressiondatetime2 值,则 ISDATE 返回 0。所以即使使用Datetime2日期类型,使用ISDATE对这个问题应该还是无解。

 

另外ISDATE 的返回值取决于 SET DATEFORMAT、SET LANGUAGE 和配置默认语言服务器配置选项设定的设置。参考下文:http://msdn.microsoft.com/zh-cn/library/ms187347.aspx

 

 

 

 

1楼SmithLiu328昨天 23:29
自己做沙发