日期:2014-05-19  浏览次数:20559 次

新开贴,再问个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