Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 两年之间的SQL日期减法_Sql Server_Date_Subtraction - Fatal编程技术网

Sql server 两年之间的SQL日期减法

Sql server 两年之间的SQL日期减法,sql-server,date,subtraction,Sql Server,Date,Subtraction,我试图从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中运行

我试图从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 server中,我得到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) 

您正在比较VARCHAR值,而不是日期

101转换为MM/DD/YY,因此您将比较月份、日期和年份


您应该使用112 yymmdd

来比较VARCHAR值,而不是日期

101转换为MM/DD/YY,因此您将比较月份、日期和年份


您应该使用112 yymmdd

两个日期之间的计算可以在本机数据类型中轻松完成,而不是将其转换为字符串。你可以从这种转换中得到错误的答案

在where子句中使用DateDiff来获取超过90天的记录


两个日期之间的计算可以在本机数据类型中轻松完成,而不是将其转换为字符串。你可以从这种转换中得到错误的答案

在where子句中使用DateDiff来获取超过90天的记录


DT.SM_T_CountTotals.PostDate列的类型是什么?尽量不要在WHERE子句中这样使用Convert,因为它将不允许您的查询正确使用索引。我建议你重新措辞,以便在两者之间使用。我假设DT.SM_T_CountTotals实际上是一个日期时间。我应该注意的是:Convertvarchar,DT.SM_T_CountTotals.PostDate,101使用任何索引都会导致问题,因为它必须执行fulll表扫描才能进行转换。转换为字符串并进行比较迟早会给您带来麻烦。查看我的答案,以获得更好的比较方法。DT.SM_T_CountTotals.PostDate列的类型是什么?尽量不要在WHERE子句中像这样使用Convert,因为它将不允许您的查询正确使用索引。我建议你重新措辞,以便在两者之间使用。我假设DT.SM_T_CountTotals实际上是一个日期时间。我应该注意的是:Convertvarchar,DT.SM_T_CountTotals.PostDate,101使用任何索引都会导致问题,因为它必须执行fulll表扫描才能进行转换。转换为字符串并进行比较迟早会给您带来麻烦。查看我的答案,找到一个更好的比较方法。这也是我建议在WHERE中选择两者的另一个原因。转换日期时间只是为了根据日期进行比较似乎很愚蠢。@Robert我不明白你为什么建议在OP的测试严格小于时进行比较。我也不明白你为什么要在我的回复中添加此注释。因为这样的计算可以通过datetime数据类型完成,这不会导致完整表扫描,也不会产生转换或强制转换的额外开销。还是我读了伊齐克·本·甘(Itzik Ben Gan)关于有效时态查询的文章读得不恰当?@robert TheOP想要postdate<今日-90的记录。我只是看不出一个BETWEEN子句如何与他的请求密切相关,其中DT.SM_t_CountTotals.PostDate介于DATEADDmm、DATEDIFFmm、0、getdate、0-90和DATEADDmm、DATEDIFFmm、0、getdate、0之间,如果对从表中选择的列执行任何操作,将无法正确使用索引。虽然这在使用Access的应用程序中可能不是什么大问题,但它可以在非常大的DBs中。这也是我建议在WHERE中使用两者之间的另一个原因。转换日期时间只是为了根据日期进行比较似乎很愚蠢。@Robert我不明白你为什么建议在OP的测试严格小于时进行比较。我也不明白你为什么要在我的回复中添加此注释。因为这样的计算可以通过datetime数据类型完成,这不会导致完整表扫描,也不会产生转换或强制转换的额外开销。还是我读了伊齐克·本·甘(Itzik Ben Gan)关于有效时态查询的文章读得不恰当?@robert TheOP想要postdate<今日-90的记录。我只是看不出一个BETWEEN子句如何与他的请求密切相关,其中DT.SM_t_CountTotals.PostDate介于DATEADDmm、DATEDIFFmm、0、getdate、0-90和DATEADDmm、DATEDIFFmm、0、getdate、0之间,如果对从表中选择的列执行任何操作,将无法正确使用索引。虽然这在使用Access的应用程序中可能不是什么大问题,但它可以在非常大的数据库中。
UPDATE  DT.SM_T_CountTotals
SET  IsActive = 0
WHERE ABS (DATEDIFF (dd, Getdate(), DT.SM_T_CountTotals.PostDate)) > 90