我有一张有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
谢谢!做到了。
最佳答案
将CASE
和ISDATE
放在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'
替换为您选择的默认日期。