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

来源:互联网 发布:修改手机mac地址软件 编辑:程序博客网 时间:2024/04/28 05:36

问题贴: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 行受影响)

*/