【问题标题】:Validate DateTime String in SQL Server 2005在 SQL Server 2005 中验证 DateTime 字符串
【发布时间】:2009-05-18 12:13:11
【问题描述】:

我需要一个 SQL 脚本来验证 SQL Server 2005 数据库中包含日期时间值的表中的 VARCHAR 字段,格式为 DD/MM/YYYYNULL 值。我想确定所有无效日期。谁能推荐一个方法?

更新

  • 答案必须使用T-SQL;出于性能原因,我无法使用 SQLCLR。

谢谢,MagicAndi

【问题讨论】:

    标签: sql sql-server sql-server-2005 validation datetime


    【解决方案1】:

    使用“ISDATE()”或“IS NULL”:但先设置语言以识别日-月-年顺序

    SET LANGUAGE british
    SELECT ISDATE('12/31/2009'), ISDATE('31/12/2009')
    
    SET LANGUAGE us_english
    SELECT ISDATE('12/31/2009'), ISDATE('31/12/2009')
    

    编辑:正如@edosoft 所述,您也可以使用 SET DATEFORMAT。 SET LANGUAGE 隐式设置 DATEFORMAT,SET DATEFORMAT 覆​​盖 SET LANGUAGE

    【讨论】:

    • 我不知道 SET LANGUAGE 位 +1
    【解决方案2】:

    您应该在使用 ISDATE() 时指定日期格式。来自在线书籍:

    SET LANGUAGE us_english;
    SET DATEFORMAT dmy;
    SELECT ISDATE('15/04/2008'); --Returns 1.
    

    【讨论】:

    • 另一个很好的答案。 SET DATEFORMAT dmy,而不是 SET LANGUAGE 英国 +1
    【解决方案3】:

    你可以使用ISDATE()函数

    【讨论】:

      【解决方案4】:

      您可以使用内置的 T-SQL IsDate() 函数。 并将列更改为 datetime 而不是 varchar。 您不能对 varchar 列进行排序或进行任何日期计算。

      【讨论】:

        【解决方案5】:

        SQL 的日期处理不是很好,我们编写了一个 DotNet 函数来针对困难的情况进行 DateTime 转换。

        【讨论】:

          【解决方案6】:

          我有一个解决方案,尽管它只适用于特定的情况。您的情况可能适合也可能不适合。

          创建一个名为 ALMANAC 的表,其中每个有效日期都有一行。您可以用十年的有效日期填充它,只有 3,653 行,或多或少。即使你走了一百年,这仍然只有 36,525 行,按照今天的标准来说不算太大。

          如果有用,您可以在此表中添加奇怪的公司特定属性。这些属性包括日期是否为公司特定假日,以及日期所属的财政周、财政月、财政季度和财政年度。

          如果您选择额外的属性,您必须编写一个程序来填充此表,并且该程序必须嵌入您公司特定的日历规则。

          然后,您可以像使用任何代码验证表一样使用此表。您还可以使用它来使古怪的日历驱动的报告标准绝对易于实施。

          仅当您的日期被限制在有限的时间跨度(例如十年甚至一百年)时,这才是一个好主意。但有时,它真的可以节省时间!我有时使用这种技术使我的数据库独立于一个供应商的日历功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-05
            • 1970-01-01
            • 1970-01-01
            • 2011-02-22
            • 1970-01-01
            相关资源
            最近更新 更多