/*需要得结果: 某一天的日期
已知条件: 这天的年,月,星期几,在这个月中处于第几周
举例说明: 希望求出2004-11-22
已知条件: 2004年, 11 月, 星期一 ,这天在11月是第四周
declare @year numeric(4),@month numeric(2),@weekday varchar(6),@week numeric(1)
set @year=2004
set @month=11
set @weekday=@#星期一@#
set @week=4
*/
alter function RequestDate
(@year numeric(4),@month numeric(2),@weekday varchar(6),@week numeric(1))
returns datetime as
begin
declare @date1 varchar(10) --得到该月的第一天的日期
declare @month1 varchar(2)
if @month<10
set @month1=@#0@#+ltrim(rtrim(str(@month)))
else
set @month1=ltrim(rtrim(str(@month)))
set @date1=ltrim(rtrim(str(@year))) + @#-@# + @month1+ @#-@# + @#01@#
declare @num1 numeric(3)
declare @num2 numeric(3)
declare @num3 numeric(3)
set @num1=datepart(ww,@date1) --得到该月的第一天在该年的周数
set @num1=@num1+@week-2 --得到该月的要求得的那天所在的周数与该年的第一周第一天的周数差
set @num2=datepart(dw,dateadd(ww,@num1,@#2004-01-01@#)) --得到日期对应的星期代号
select @num3=case @weekday
when @#星期日@# then 1
when @#星期一@# then 2
when @#星期二@# then 3
when @#星期三@# then 4
when @#星期四@# then 5
when @#星期五@# then 6
when @#星期六@# then 7
end
return dateadd(dd,@num3-datepart(dw,dateadd(ww,@num1,@#2004-01-01@#)),dateadd(ww,@num1,@#2004-01-01@#))
end
-- select dbo.RequestDate(2004,11,@#星期一@#,4)