在将数据从 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 文章指出该函数将返回“如果表达式是有效的日期、时间或日期时间值,则返回 1;否则返回 0”。
据我所知,使用 SET DATEFORMAT 或 SET LANGUAGE 并不能缓解此错误。
CONVERT() 似乎也没有与 CAST() 不同的结果。
幸运的是, ISDATE() 确实成功地预测了文本是否可以转换为datetime。
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
但是,我想知道我是否遗漏了什么。有没有更简洁的方式将文本转换为日期?作为推论,在 MSDN 上是否没有正确定义 ISDATE() 函数(因此实际上有点用词不当)?