最近用户有个需求,通过一个时间段,来计算出,每个月的天数。记录一下之前做过的功能.
1.创建一个函数
create FUNCTION[dbo].[Func_GetMonthFirstDayByDay]
(
@Date DATE
)
RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)
END
2.创建一个存储过程。
create proc[dbo].[Proc_月份时间段]
(
@StartTime datetime,
@EndTime datetime
)
AS
--declare @StartTime datetime
--set @StartTime='2013-01-09'
--declare @EndTime datetime
--set @EndTime='2013-11-13'
declare @月份第一天 datetime
set @月份第一天=[dbo].[Func_GetMonthFirstDayByDay](@StartTime)
declare @tb table (IDint,月份nvarchar(100),开始时间datetime,结束时间datetime)
declare @月份 nvarchar(100)
declare @开始时间 datetime
declare @i int
set @i=1
declare @count int
select @count=count(*)from master..spt_values
where type='P'and dateadd(month,number,@月份第一天)<=@EndTime
insert into@tb(ID,月份,开始时间,结束时间)
select
ROW_NUMBER()OVER (ORDERBY number ) as ID,convert(varchar(7),dateadd(month,number,@月份第一天),120)AS 月份,
dateadd(month,number,@月份第一天)as 开始时间,
dateadd(month,number,dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,@StartTime)+1, 0))) as 结束时间
from master..spt_values
where type='P'and dateadd(month,number,@月份第一天)<=@EndTime
update @tb set 开始时间=@StartTimewhereID=1
update @tb set 结束时间=@EndTimewhereID=@count
SELECT *,datediff(day,开始时间,结束时间)+1 as 天数 FROM @tb
--exec [dbo].[Proc_月份时间段] '2013-1-13','2013-11-13'
3.执行之后的效果如下: