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