1

MS Access から変換しようとしているクエリに問題があります。クエリ フラグ レコードが 90 日より古い場合は削除されますが、このクエリを SQL サーバーに変換すると、削除されるレコードが多すぎます。

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) 
4

2 に答える 2

3

DATEではなく、VARCHAR値を比較しています。

101 は MM/DD/YY に変換されるため、月、日、年を比較しています。

112 (yymmdd) を使用する必要があります。

于 2011-01-24T14:33:36.367 に答える
1

2 つの日付間の計算は、文字列に変換するのではなく、ネイティブ データ型で簡単に実行できます。そのような変換から間違った答えを得ることができます (そして、あなたはそうしています)。

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
于 2011-01-24T14:35:37.210 に答える