我有一张有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
问题很可能是数据的存储方式,只有两种安全格式; ISO YYYYMMDD; ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm(无空格)
isdate()
检查不会照顾这个吗?
我不需要100%的准确性.我只想获得过去30天的大部分记录.
@SQLMenace
select isdate('20080131') -- returns 1 select isdate('01312008') -- returns 0
@Brian Schkerke
将CASE和ISDATE放在CONVERT()函数中.
谢谢!这样做了.
放置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'
为您选择的默认日期.