我正在尝试从MS Access转换的查询出现问题。查询标记记录,以便在超过90天时删除,但是当我将此查询转换为sql server时,会删除太多记录。
UPDATE DT.SM_T_CountTotals
SET IsActive = 0
WHERE Convert(varchar, DT.SM_T_CountTotals.PostDate, 101) <
Convert(varchar, GetDate()- 90, 101)
当我在MS Access中运行此查询时,我总共获得了3793条被标记的记录,但在SQL服务器中,我获得了69061条被标记为要删除的记录。 GetDate() - 90值在2010年10月26日是正确的,但它正在标记今年要删除的所有内容。
我确信这是我容易忽视的事情。请帮忙吗?
我明白了:
UPDATE DT.SM_T_CountTotals
SET IsActive = 0
WHERE DT.SM_T_CountTotals.PostDate < Convert(varchar, GetDate()- 90, 101)
答案 0 :(得分:3)
您正在比较VARCHAR值,而不是DATE。
101转换为MM / DD / YY,因此您要比较月,日,然后年。
你应该使用112(yymmdd)
答案 1 :(得分:1)
两个日期之间的计算可以在原生数据类型中轻松完成,而不是将其转换为字符串。可以(并且你有)从这种转换中得到错误的答案。
在where子句中使用DateDiff
来获取超过90天的记录。
http://msdn.microsoft.com/en-us/library/ms189794.aspx
UPDATE DT.SM_T_CountTotals
SET IsActive = 0
WHERE ABS (DATEDIFF (dd, Getdate(), DT.SM_T_CountTotals.PostDate)) > 90