Вычитание даты SQL между двумя годами - PullRequest
1 голос
/ 24 января 2011

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

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

Я разобрался:

UPDATE  DT.SM_T_CountTotals
   SET  IsActive = 0
WHERE DT.SM_T_CountTotals.PostDate < Convert(varchar, GetDate()- 90, 101) 

Ответы [ 2 ]

3 голосов
/ 24 января 2011

Вы сравниваете значения VARCHAR, а не DATE.

101 преобразуется в MM / DD / YY, поэтому вы сравниваете месяц, затем день и год.

Вы должны использовать 112 (ггмдд)

1 голос
/ 24 января 2011

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

Используйте DateDiff в предложении where для получения записей старше 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
...