我有一张有 100 万多条记录的大表。不幸的是,创建表格的人决定将日期放在 varchar(50)
中。 field 。
我需要做一个简单的日期比较 -
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
The problem is most likely how the data is stored, there are only two safe formats; ISO YYYYMMDD; ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm (no spaces)
isdate()
不会吗?检查照顾这个?我不需要 100% 的准确率。我只想获取过去 30 天的大部分记录。
@SQLMenace
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
@Brian Schkerke
Place the CASE and ISDATE inside the CONVERT() function.
谢谢!做到了。
最佳答案
放置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'
使用您选择的默认日期。
关于sql-server - SQL Server 日期时间转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110/