【问题标题】:How do I determine if text can be converted to Date?如何确定文本是否可以转换为日期?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-21
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2012-04-12
      • 1970-01-01
      • 2013-05-25
      相关资源
      最近更新 更多