问题贴:http://topic.csdn.net/u/20100509/20/045e886c-a38d-4614-a5a4-aa2add05a95b.html?42337
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-09 22:04:38
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1
-- Blog : http://blog.csdn.net/htl258
-- Subject: 显示每月的日期属于该月的第几周
----------------------------------------------------------------------------------
if object_id('fn_getwk') is not null
drop function fn_getwk
go
create function fn_getwk(
@year int,--输入显示的年份
@month int, --输入显示的月份
@type bit=0 --指定每周的第一天,默认为星期日(中国习惯),如果参数为就是星期一为每周的第一天
) returns @t table(
周数 nvarchar(10),
开始日期 varchar(10),
结束日期 varchar(10)
) as
begin
declare @d datetime
set @d=dateadd(wk,datediff(wk,'1900',cast(ltrim(@year*10000+@month*100+1) as datetime)),'1900')+@type
;with t as
(
select top (datediff(dd,ltrim(@year*10000+@month*100+1),ltrim(@year*10000+(@month+1)*100+1)))
[date]=cast(ltrim(@year*10000+@month*100+1) as datetime)-1
+row_number()over(order by getdate())
from sysobjects
)
insert @t
select
case
when [date] < @d+6 then '第一周'
when [date] < @d+13 then '第二周'
when [date] < @d+20 then '第三周'
when [date] < @d+27 then '第四周'
when [date] < @d+34 then '第五周'
else '第六周'
end AS 周数,
convert(varchar,min([date]),23) 开始日期,
convert(varchar,max([date]),23) 结束日期
from t
group by
case
when [date] < @d+6 then '第一周'
when [date] < @d+13 then '第二周'
when [date] < @d+20 then '第三周'
when [date] < @d+27 then '第四周'
when [date] < @d+34 then '第五周'
else '第六周'
end
order by 2
return
end
GO
select * from fn_getwk(2010,5,0)
select * from fn_getwk(2010,5,0)
/*
周数 开始日期 结束日期
---------- ---------- ----------
第一周 2010-05-01 2010-05-01
第二周 2010-05-02 2010-05-08
第三周 2010-05-09 2010-05-15
第四周 2010-05-16 2010-05-22
第五周 2010-05-23 2010-05-29
第六周 2010-05-30 2010-05-31
(6 行受影响)
*/
select * from fn_getwk(2010,5,1)
/*
周数 开始日期 结束日期
---------- ---------- ----------
第一周 2010-05-01 2010-05-02
第二周 2010-05-03 2010-05-09
第三周 2010-05-10 2010-05-16
第四周 2010-05-17 2010-05-23
第五周 2010-05-24 2010-05-30
第六周 2010-05-31 2010-05-31
(6 行受影响)
*/