У меня есть следующая функция, которая должна вернуть начальную и конечную даты месяцев между двумя месяцами, проблема в том, что с момента этого месяца 28 дней функция вычисляет все предстоящие месяцы на 28-дневной основе таким образом возвращая следующие неправильные значения.Получить начальную и конечную даты месяца между двумя датами в SQL?
StartDate EndDate
-----------------------
2013-02-01 2013-02-28
2013-03-01 2013-03-28
2013-04-01 2013-04-28
declare @sDate datetime,
@eDate datetime;
select @sDate = '2013-02-25',
@eDate = '2013-04-25';
;with months as
(
select DATEADD(mm,DATEDIFF(mm,0,@sDate),0) StartDate,
DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@sDate)+1,0)) EndDate
union all
select dateadd(mm, 1, StartDate),
dateadd(mm, 1, EndDate)
from months
where dateadd(mm, 1, StartDate)<= @eDate
)
select * from months
Как я могу изменить это, чтобы возвращать правильные даты?
Вы не должны использовать инклюзивный верхнего предела - вы должны сказать "меньше, чем в начале следующего месяца. Это неправильный способ думать о значениях даты/времени/времени, и [очевидно, что SQL Server имеет уникальный набор проблем] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do -between-and-the-devil-have-in-common.aspx), чтобы справиться с этим. Итак, начните месяц, добавьте месяц и используйте инклюзивную нижнюю границу ('> =') и эксклюзивную верхнюю границу ('<'). –