Вычитание даты SQL между двумя годами
-
23-10-2019 - |
Вопрос
У меня проблема с запросом, который я пытаюсь преобразовать из 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