Не используйте between
, и работа становится намного проще.Используйте меньше, чем первый день текущего месяца , который точно находит все до этой даты (вместо последнего дня предыдущего месяца).Вычтите 3 года с этой же даты и используйте> = в качестве начальной точки.
Select *
From yourtables
where datecol >= dateadd (year,-3,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) )
And datecol < DATEADD(mm,DATEDIFF(m,0,GETDATE()),0)
Пожалуйста, не используйте решение, использующее 23:59:59 в качестве конца дня.Это не конец дня, и некоторые типы данных теперь поддерживают точность времени менее секунды.
Если вы действительно не можете использовать ноль в функциях даты, просто используйте базовую дату '1900-01-01 'вместо
SELECT
DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01'))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01')
;
Это также должно работать (здесь работает *1013*):
SELECT
DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)
;