代码之家  ›  专栏  ›  技术社区  ›  Martin Marconcini

在SQL Server 2008中查找无效日期

  •  6
  • Martin Marconcini  · 技术社区  · 14 年前

    我有一个300.000行的表;其中一列是varchar(),但它实际上包含日期x x/x x/XXXX或x/x/XXXX或类似的数据。但执行以下测试会产生错误:

    SELECT CAST(MyDate as Datetime) FROM MyTable
    

    问题是它不能告诉我哪一行

    我已经通过试用执行了一系列__手动_更新一个错误,并执行了简单的更新来修复这些错误,但__必须有一些奇怪的值需要删除或修复。

    例如,我执行了一个简单的测试,修复了大约40行:

    UPDATE MyTable SET MyDate = REPLACE(MyDate, '/000','/200') FROM MyTable WHERE MyDate like ('%/000%’)
    UPDATE MyTable SET MyDate = REPLACE(MyDate, '/190','/199') FROM MyTable WHERE MyDate like ('%/190%’)
    

    这修复了很多奇怪的行,比如01/01/0003等等。(日期从1998年到2010年)。

    不过,我想知道 哪一个 行在上面的选择中失败。

    打印这些文件的最佳方法是什么?这样我既可以删除它们,也可以编辑它们,或者看看该怎么做?谢谢。

    4 回复  |  直到 8 年前
        1
  •  19
  •   Robin Day    14 年前
    SELECT
        *
    FROM
       MyTable
    WHERE
        ISDATE(MyDate) = 0
    
        2
  •  4
  •   Jakob Christensen    14 年前

    你试过了吗? ISDATE 功能?

        3
  •  0
  •   John Waclawski    11 年前

    小心ISDATE。我在几千张桌子上有一张坏记录。它说8201-11-30是一个有效日期。ISDATE应该有一个年份限制。

        4
  •  0
  •   Jonas    8 年前

    ISDATE似乎并不总是有效。

    在SQL Server 2008 R2中,以下返回1 Select ISDATE('04- December 20')

    但尝试将相同的值强制转换为当前值将失败。 Select cast('04- December 20' as date)

    从字符串转换日期和/或时间时转换失败。