日期:2014-05-17  浏览次数:20586 次

???给定开始、结束两个日期参数,如何得到下面的结果???
请问,给定开始、结束两个日期参数,如何得到下面的结果集
如:

开始日期:2010-10-05
结束日期:2011-3-20

如何将这两个区间包含的年月插入到指定表T1中,T1表包含nian、yue字段
nian  yue
2010  10
2010  11
2010  12
2011  01
2011  02
2011  03



------最佳解决方案--------------------

create   function   calcmonth(@dt1   datetime,@dt2   datetime) 
returns   @re   table(id   int   identity(1,1),yyyy int,MM int) 
as 
begin 
declare   @month1   int
declare   @year1 int
declare   @month2   int
declare   @year2 int
declare   @count int
select   @month1=MONTH(@dt1)
select  @year1=YEAR(@dt1)
select   @count=datediff(month,@dt1,@dt2)

while @count>=0
begin 
insert   into   @re(yyyy,MM) values(@year1,@month1)
set @count=@count-1
set @month1=@month1+1
if @month1>12
begin
set @month1=1
set @year1=@year1+1
end
end
return 
end 
GO
--调用方法
Select * from dbo.calcmonth('2010-5-1','2011-3-20')

------其他解决方案--------------------
create table #T1(nian char(4),yue char(2))
declare @begindate Date='2010-10-5'
declare @enddate date='2011-3-20'
declare @i int=0,@count int=DATEDIFF(month,@begindate,@enddate)

while  @i<=@count
begin
insert into #T1
select ltrim(YEAR(@begindate)),right('00'+cast(MONTH(@begindate) as varchar(2)),2)
set @begindate=DATEADD(month,1,@begindate)
set @i=@i+1
end
select * from #T1
------其他解决方案--------------------
顶- -
CREATE table #T1 (nian char(4),yue char(2))
declare @begindate Datetime
SET @begindate='2010-10-5'
declare @enddate datetime
SET @enddate='2011-3-20'
declare @i int,@count int
SET @i=0
SET @count=DATEDIFF(month,@begindate,@enddate)

while  @i<=@count
begin
insert INTO #T1
select ltrim(YEAR(@begindate)),right('00'+cast(MONTH(@begindate) as varchar(2)),2)
set @begindate=DATEADD(month,1,@begindate)
set @i=@i+1
end
select * from #T1 



------其他解决方案--------------------

DECLARE @start DATETIME='2010-10-05',
@end DATETIME='2011-3-20'
SELECT YEAR(DATEADD(MONTH,number,@start)) AS [nian],
CASE LEN(MONTH(DATEADD(MONTH,number,@start))) WHEN 1 
THEN LTRIM(0)+LTRIM(MONTH(DATEADD(MONTH,number,@start))) 
ELSE LTRIM(MONTH(DATEADD(MONTH,number,@start))) 
END AS [yue]
FROM master..spt_values
WHERE [type]='P'
AND DATEADD(MONTH,number,@start)<=@end

--------------------
nian yue
2010 10
2010 11
2010 12
2011 01
2011 02
2011 03

------其他解决方案--------------------
引用: