Sql server 如何确定文本是否可以转换为日期?

Sql server 如何确定文本是否可以转换为日期?,sql-server,datetime,Sql Server,Datetime,在将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 SELECT 'This will return a date' = CAS

在将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
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
我认为这有点奇怪,因为声明如果表达式是有效的日期、时间或日期时间值,函数将返回“1;否则返回0”

据我所知,使用SET-DATEFORMAT或SET-LANGUAGE都无法缓解此错误

CONVERT()与CAST()的结果也不一样

幸运的是,ISDATE()确实成功地预测了文本是否可以转换为datetime

所以,我可以使用一种变通方法,先选择日期时间,然后选择日期

SELECT 'This will return an error' =
    CASE
    WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS date)
    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上没有正确定义(因此实际上有点用词不当)?

ISDATE和IsNumeric实际上都没有尝试将值转换为所讨论的类型。相反,它们会告诉您所讨论的值是否可以转换为日期或数字。SQL Server 2012通过TRY_PARSE函数解决了这一问题。在此期间,您需要对数据进行一些清理,或者创建一个进行清理的函数