Вопрос

У меня проблема с запросом, который я пытаюсь преобразовать из 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 является правильным в 26.10.2010, но оно помечает все, от этого года, которое будет удалено.

Я уверен, что это что -то простое, что я упускаю из виду. Помогите, пожалуйста?

Я понял:

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)

Другие советы

Расчеты между двумя датами могут быть легко выполнены в собственном типе данных, а не конвертируют его в строку. Можно (и у вас есть) получить неправильные ответы от таких конверсий.

Использовать 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top