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月天数不同情况)

解决方案 »

  1.   

    楼主能说清楚GetMonth(2007,29)这种情况需要什么结果吗?具体的结果还有像GetMonth(2007,30),GetMonth(2007,31),GetMonth(2007,99)这样的情况……
      

  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-02-01 23:59:59.997
    ...薪资月份        薪资起始日                    薪资结束日       
    ----------- ------------------------ ------------------------
    1           2006-12-28 00:00:00.000  2007-01-27 23:59:59.997
    2           2007-01-28 00:00:00.000  2007-02-27 23:59:59.997
    ...薪资月份        薪资起始日                    薪资结束日       
    ----------- ------------------------ ------------------------