【发布时间】:2008-08-26 14:01:43
【问题描述】:
我有一个包含 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() 函数中。
谢谢!做到了。
【问题讨论】:
-
您没有提到 varchar 字段的日期格式。它们的格式是否一致?了解格式将有助于解决问题。
标签: sql-server datetime