根据年月生成日历函数

go

--创建函数(第一版)(作者:dobear_0922)

create function fn_Calendar(@year int, @month int)

returns nvarchar(max)

as

begin

    declare @result nvarchar(max), @Enter nvarchar(8)

    select @Enter = char(13)+char(10),  @result = ' Sun Mon Tue Wed Thu Fri Sat' + @Enter --表头

 

    declare @start datetime, @end datetime

    select @start = rtrim(@year)+'-'+rtrim(@month)+'-1', @end = dateadd(mm, 1, @start)   

 

    set @result = @result+replicate('    ', (datepart(dw, @start)+@@datefirst+6)%7)    --第一行前面的空格

    while datediff(d, @start, @end)>0

    begin

        if (datepart(dw, @start)+@@datefirst)%= 1

            select @result = @result+@Enter --是否换行

        select @result = @result+right('   '+rtrim(day(@start)), 4), @start = dateadd(d, 1, @start)

    end

    return @result

end

 

go

--测试示例

set datefirst 3

print dbo.fn_Calendar(2007, 12)

select dbo.fn_Calendar(2007, 12)

set datefirst 7

 

--运行结果

/*

 Sun Mon Tue Wed Thu Fri Sat

                           1

   2   3   4   5   6   7   8

   9  10  11  12  13  14  15

  16  17  18  19  20  21  22

  23  24  25  26  27  28  29

  30  31

*/

 

go

--创建函数(第二版)(作者:libin_ftsafe)

create function f_calendar(@year int,@month int)

returns @t table(varchar(4),varchar(4),varchar(4),varchar(4),varchar(4),varchar(4),varchar(4))

as

begin

    declare @a table(id int identity(0,1),date datetime)

    insert into @a(date)

    select top 31 rtrim(@year)+'-'+rtrim(@month)+'-1' from sysobjects

    update @a set date=dateadd(dd,id,date)   

    insert into @t

    select

        max(case datepart(dw,date) when 7 then rtrim(day(date)) else '' end),

        max(case datepart(dw,date) when 1 then rtrim(day(date)) else '' end),

        max(case datepart(dw,date) when 2 then rtrim(day(date)) else '' end),

        max(case datepart(dw,date) when 3 then rtrim(day(date)) else '' end),

        max(case datepart(dw,date) when 4 then rtrim(day(date)) else '' end),

        max(case datepart(dw,date) when 5 then rtrim(day(date)) else '' end),

        max(case datepart(dw,date) when 6 then rtrim(day(date)) else '' end)

    from

        @a

    where

        month(date)=@month

    group by

        (case datepart(dw,date) when 7 then datepart(week,date)+else datepart(week,date) end)

 

    return

end

 

go

--测试示例

set datefirst 1

select * from dbo.f_calendar(2007,12)

 

--运行结果

/*

                  

---- ---- ---- ---- ---- ---- ----

                              1

2    3    4    5    6    7    8

9    10   11   12   13   14   15

16   17   18   19   20   21   22

23   24   25   26   27   28   29

30   31                 

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值