我有一张有 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
在这种情况下,我不关心性能。这将是一次查询。将表更改为日期时间字段不是一种选择。
我已经尝试添加第三个参数,它没有任何区别。
问题很可能是数据是如何存储的,只有两种安全格式;ISO YYYYMMDD;ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm(无空格)
isdate()
支票不会解决这个问题吗?
我不需要 100% 的准确率。我只想获取过去 30 天的大部分记录。
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
将 CASE 和 ISDATE 放在 CONVERT() 函数中。
谢谢!做到了。