在SQL Server 2008中查找无效日期

时间:2010-06-17 10:48:46

标签: sql-server-2008 date

我有300.000行表;其中一列是varchar()但它确实包含日期xx / xx / 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 个答案:

答案 0 :(得分:20)

SELECT
    *
FROM
   MyTable
WHERE
    ISDATE(MyDate) = 0

答案 1 :(得分:4)

您是否尝试过ISDATE功能?

答案 2 :(得分:1)

小心IsDate。我在一张数千人的桌子上有1条不良记录。它说8201-11-30是一个有效的日期。 IsDate应该有YEAR限制。

答案 3 :(得分:1)

ISDATE似乎并不总是有效。

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

但是尝试将相同的值转换为日期将失败。 Select cast('04- December 20' as date)

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