新开贴,再问个Sql问题,希望各位能帮解决一下,这个急需,分不够可再加
CREATE   function   dbo.fn_GetMonth(@Year   int,@Day   int) 
 returns   @tb   table([薪资月份]   int,薪资起始日   datetime,薪资结束日   datetime) 
 as 
 begin 
 declare   @m   int 
 set   @m=12; 
 declare   @i   int 
 set   @i   =1 
 while(@i <=@m) 
             begin 
             declare   @date   char(10) 
             set   @date=rtrim(@Year)+ '- '+rtrim(@i)+ '- '+rtrim(@Day+1) 
             insert   @tb   select   薪资月份=@i,   DATEADD(mm,   datediff(mm,0,@date),0)   as   薪资起始日,dateadd(ms,-3,DATEADD(mm,      DATEDIFF(mm,0,dateadd(m,1,@date)),      0))   as   薪资结束日 
             set   @i=@i+1 
             end 
 return 
 end   
 调用fn_GetMonth(2007,1)得到如下 
 月份   起始日                     结束日 
    1            2007-1-1            2007-1-31 
    2            2007-2-1            2007-1-28 
    3            2007-3-1            2007-1-31 
    4            2007-4-1            2007-1-30 
 ... 
    12         2007-12-1         2007-1-31     
 调用fn_GetMonth(2007,25)得到如下 
 月份         起始日                  结束日 
    1            2006-12-25         2007-1-24 
    2            2007-1-25         2007-2-24 
    3            2007-2-25         2007-3-24 
    4            2007-3-25         2007-4-24 
 ... 
    12         2007-11-1         2007-12-24   
 要考虑到调用GetMonth(2007,29)这种情况(2月天数不同情况) 
------解决方案--------------------不知道楼主的期望是不是这样   
 --  当日期大于2月最大一天时不返回值 
 create function dbo.fn_GetMonth(@Year int,@Day int) 
 returns @tb table([薪资月份] int,薪资起始日 datetime,薪资结束日 datetime) 
 as 
 begin 
 declare @m int 
 set @m=12; 
 declare @i int 
 set @i =1 
 if day(dateadd(day, -1, cast(@year as varchar)+ '0301 '))  < @day 
 return 
 while(@i <=@m) 
     begin 
     declare @date char(10) 
     set @date=rtrim(@Year)+ '- '+rtrim(@i)+ '- '+rtrim(@Day) 
     if @day >  1 
 	set @date = dateadd(mm, -1, @date) 
     insert @tb select 薪资月份=@i, DATEADD(mm, datediff(mm,0,@date),@day-1) as 薪资起始日,dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,dateadd(m,1,@date)),  @day-1)) as 薪资结束日 
     set @i=@i+1 
     end 
 return 
 end   
 -- 测试语句 
 select top 2 * from dbo.fn_GetMonth(2007,1) 
 select top 2 * from dbo.fn_GetMonth(2007,2) 
 select top 2 * from dbo.fn_GetMonth(2007,28) 
 select top 2 * from dbo.fn_GetMonth(2007,29) -- 不返回值 
 -- 执行结果 
 薪资月份        薪资起始日                    薪资结束日        
 ----------- ------------------------ ------------------------ 
 1           2007-01-01 00:00:00.000  2007-01-31 23:59:59.997 
 2           2007-02-01 00:00:00.000  2007-02-28 23:59:59.997 
 ...   
 薪资月份        薪资起始日                    薪资结束日        
 ----------- ------------------------ ------------------------ 
 1           2006-12-02 00:00:00.000  2007-01-01 23:59:59.997 
 2           2007-01-02 00:00:00.000  2007-0