create table #data (name varchar(50),begindate date,enddate date)
insert into #data values('甲一','2021-01-02','2021-03-05')
insert into #data values('甲二','2020-12-05','2021-01-28')
select * from #data
期望求,已知表里,两个时间字段,之间,所有月份对应一行数据;
--预期得到的结果:Begindate 和 Enddate期间的月份
name ,Startmonth,Begindate ,Enddate
甲一 ,2021-01-01,2021-01-02 ,2021-03-05
甲一 ,2021-02-01,2021-01-02 ,2021-03-05
甲一 ,2021-03-01,2021-01-02 ,2021-03-05
甲二 ,2020-12-01,2020-12-05 ,2021-01-28
甲二,2021-01-01,2020-12-05,2021-01-28
为了得到一个月的第一天,调用 DAY
函数。有了 DAY
函数,就能方便地知道给定日期是当前月份的第几天。如果用当前日期减去 DAY(GETDATE( ))
函数调用的返回值,我们将得到上个月的最后一天;在此基础上加上 1 天的话,就能计算出当前月份的第一天。为了获取当前月份的最后一天,需要调用 DATEADD
函数。在当前日期的基础上加上 1
个月,然后减去调用 DAY(GETDATE( ))
函数的返回值,这样就得到了当前月份的最后一天。
select dateadd(day,-day(getdate())+1,getdate()) firstday,
2 dateadd(day,
3 -day(getdate( )),
4 dateadd(month,1,getdate())) lastday
5 from t1
我要,根据已知表的两个时间字段,把期间所有月份,都列出来。。。
不是获取第一天、最后一天....
好吧。。。。自己解决了,用递归的方式:
with cte as(
select dateadd(dd,1-datepart(dd,begindate),begindate) as startmonth,name,begindate,enddate
from #data
union all
select dateadd(mm,1,A.startmonth),a.name,A.begindate,A.enddate from cte A
join #data B on A.name=B.name and A.begindate=B.begindate and a.enddate=b.enddate
where dateadd(mm,1,A.startmonth)<=B.enddate
)
select * from cte order by name,startmonth