CHill60
Ваша проблема заключается в том, что вы не думаете о числах, которые выходят из вашего мозга. DATEDIFF
расчет.
Рассмотрим этот пример:
declare @SamplTable table (email nvarchar(255), expirydate date)
insert into @SamplTable (email, expirydate) values
('email.1@emailprovider', '14-MAY-2018'),
('email.2@emailprovider', '13-JUL-2018'),
('email.2@emailprovider', '13-JUL-2019'),
('email.3@emailprovider', '15-MAR-2018'),
('email.4@emailprovider', '14-MAR-2018')
SELECT email, expirydate, DATEDIFF(day,expirydate, GETDATE()) from @SamplTable
Результаты таковы
email.1@emailprovider 2018-05-14 0
email.2@emailprovider 2018-07-13 -60
email.2@emailprovider 2019-07-13 -425
email.3@emailprovider 2018-03-15 60
email.4@emailprovider 2018-03-14 61
поэтому, когда вы ставите свой фильтр
where DATEDIFF(day,expirydate, GETDATE())<=60
вы также собираетесь забрать эту дату в 2019 году.
Я предпочитаю думать о датах в будущем как о положительном числе "дней до" - то есть поворачивать время вспять.
DATEDIFF
ценностей вокруг немного ...то есть
SELECT email, expirydate, DATEDIFF(day,GETDATE(), expirydate) from @SamplTable where DATEDIFF(day, GETDATE(),expirydate)<=60
что дает результаты
email.1@emailprovider 2018-05-14 0
email.2@emailprovider 2018-07-13 60
email.3@emailprovider 2018-03-15 -60
email.4@emailprovider 2018-03-14 -61
Это становится лучше, но теперь я получаю свидания и в прошлом.
Способ обойти это заключается в использовании
BETWEEN
...
SELECT email, expirydate, DATEDIFF(day,GETDATE(), expirydate) from @SamplTable where DATEDIFF(day,GETDATE(), expirydate) BETWEEN 0 AND 60
что и дает результаты
email.1@emailprovider 2018-05-14 0
email.2@emailprovider 2018-07-13 60