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

时间:2012-05-06 16:28:05

标签: 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

我认为这有点奇怪,因为ISDATE() MSDN article表示如果表达式是有效的日期,时间或日期时间值,函数将返回“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

然而,我想知道我是否遗漏了一些东西。是否有更简洁的方式将文字投射到约会?作为必然结果,ISDATE()函数是否在MSDN上没有正确定义(实际上有点用词不当)?

1 个答案:

答案 0 :(得分:3)

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