显示每月的日期属于该月的第几周

问题贴: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 <X86> (Build 2600: Service Pack 3)

-- 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 行受影响)

*/

你可能感兴趣的:(sql,.net,SQL Server,Microsoft,Go)