【发布时间】:2013-02-10 22:19:09
【问题描述】:
我有以下函数,它应该返回两个月之间月份的开始日期和结束日期,但问题是,由于本月是 28 天,因此该函数正在计算 28 天内所有即将到来的月份基础因此返回以下错误值。
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
如何修改它以返回正确的日期?
【问题讨论】:
-
您不应该使用包容性上限 - 您应该说“小于下个月的开始”。这是考虑日期/时间/时间戳值的错误方法,apparently SQL Server has a unique set of problems 也在处理这个问题。因此,获取月初,添加一个月,并使用包含下限 (
>=) 和独占上限 (<)。
标签: sql sql-server