【发布时间】:2012-05-15 09:01:35
【问题描述】:
在将数据从 Access 数据库转换和规范化到 SQL Server 数据库时,我遇到了一个有趣的问题:ISDATE() 似乎无法成功预测文本是否可以转换为日期。
SELECT 'This will return an error' =
CASE
WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS date)
ELSE NULL
END
我觉得这有点奇怪,因为ISDATE() MSDN article 声明该函数将返回“如果表达式是有效的日期、时间或日期时间值,则返回 1;否则返回 0。”
据我所知,使用 SET DATEFORMAT 或 SET LANGUAGE 都无法缓解此错误。
CONVERT() 的结果似乎也与 CAST() 不同。
幸运的是,ISDATE() 确实成功预测了文本是否可以转换为日期时间。
SELECT 'This will return a datetime' =
CASE
WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS datetime)
ELSE NULL
END
所以,我可以使用一种变通方法,先转换为日期时间,然后再转换为日期。
SELECT 'This will return a date' =
CASE
WHEN ISDATE('1/1-2010') = 1 THEN CAST(CAST('1/1-2010' AS datetime) as date)
ELSE NULL
END
但是,我想知道我是否遗漏了什么。有没有更简洁的方式将文本转换为日期?作为推论,ISDATE() 函数是否在 MSDN 上没有正确定义(因此实际上有点用词不当)?
【问题讨论】:
标签: sql-server datetime