4

在将数据从 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() 函数(因此实际上有点用词不当)?

4

1 回答 1

3

IsDate 和 IsNumeric 实际上都没有尝试将您的值转换为相关类型。相反,他们会告诉你是否有问题的价值看起来可以转换为日期或数字。SQL Server 2012 使用 TRY_PARSE 函数解决了这个问题。在此期间,您需要对数据进行一些清理或创建一个执行该清理的函数。

于 2012-05-06T17:00:52.787 回答