我有一张有100万条以上记录的大桌子。不幸的是,创建表的人决定将日期放在varchar(50)字段中。

我需要进行简单的日期比较-

datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31

但是在convert()上失败了:
Conversion failed when converting datetime from character string.

显然,在该字段中有一些它不喜欢的东西,并且由于记录太多,我不能仅仅通过查看就知道。如何正确清理整个日期字段,使其在convert()上不会失败?这是我现在所拥有的:
select count(*)
from MyTable
where
    isdate(lastUpdate) > 0
    and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31

@SQLMenace

我不关心这种情况下的性能。这将是一次性查询。不能将表更改为日期时间字段。

@Jon Limjap

我尝试添加第三个参数,但没有区别。

@SQLMenace


isdate()检查不能解决这个问题吗?

我不需要100%的准确性。我只想获取过去30天的大部分记录。

@SQLMenace
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0

@Brian Schkerke



谢谢!做到了。

最佳答案

CASEISDATE放在CONVERT()函数内。

SELECT COUNT(*) FROM MyTable
WHERE
    DATEDIFF(dd, CONVERT(DATETIME, CASE IsDate(lastUpdate)
        WHEN 1 THEN lastUpdate
        ELSE '12-30-1899'
    END), GetDate()) < 31

'12-30-1899'替换为您选择的默认日期。

10-06 10:34