整体思路:当前日期月份+1,得到下个月日期,然后将下个月日期第一天-1,得到当前日期的最后一天,从而得知当前月的总天数。
最后结合master..spt_values重构。
需使用master..spt_values系统表重构日期。
先将当前日期的月份+1.得到下个月的日期
例:2012-1-31 月份+1后: 2012-2-29
再截取日期得到下个月月初的日期:
convert( char(07), dateadd(month,1,getdate()),120 )+'-01' --->得到:2012-02-01
再将日期中天数减1,得到当前月份日期的最后一天。
dateadd( day,-1, convert( char(07), dateadd(month,1,getdate()),120 )+'-01' ) --->得到:2012-01-31
然后,获取这个日期的天数。
day( dateadd( day,-1, convert( char(07), dateadd(month,1,getdate()),120 )+'-01' ) ) --->得到 31
最后结合master..spt_values,编写SQL语句:
select dateadd(day,number,convert(varchar(7),getdate(),120)+'-01') da
from master..spt_values
where type='p' and number< day(dateadd(day,-1,convert(char(07),dateadd(month,1,getdate()),120)+'-01'))
另外一种解法:
with ab
as
(
select cast(convert(varchar(7),getdate(),120)+'-01' as datetime) da
union all
select dateadd(day,1,da)
from ab
where dt<dateadd(day,-1,convert(char(07),dateadd(month,1,getdate()),120)+'-01')
)
select * from ab
同理,给一个日期,列出上个月的所有日期天数
select dateadd(day,number,convert(varchar(7),getdate(),120)+'-01') da
from Master..spt_values
where type='p' and number<day(dateadd(day,-1,convert(char(07),getdate(),120)+'-01'))
另外一种解法:
with ab
as
(
select cast(convert(varchar(7),getdate(),120)+'-01' as datetime) da
union all
select dateadd(day,1,da)
from ab
where dt<dateadd(day,-1,convert(char(07),getdate(),120)+'-01')
)
select * from ab