日期:2014-05-16 浏览次数:20530 次
今天看到一个帖子,将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 是有效的date、time 或datetime 值,则返回 1;否则,返回 0。如果expression 为datetime2 值,则 ISDATE 返回 0。所以即使使用Datetime2日期类型,使用ISDATE对这个问题应该还是无解。
另外ISDATE 的返回值取决于 SET DATEFORMAT、SET LANGUAGE 和配置默认语言服务器配置选项设定的设置。参考下文:http://msdn.microsoft.com/zh-cn/library/ms187347.aspx