自己写的一个函数:根据月分打印月历【SQL版】

 

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 ) % 7   =   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

drop   function  dbo.fn_Calendar

/*
 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

------------------------------------------
 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

(1 row(s) affected)
*/

 

 呵呵,下面是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) + 1   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                  
*/

go

drop   function  f_calendar
go

 

 对比一下,感觉我的更容易理解,而且不管@@datefirst的值怎么变化都不会出错,libin_ftsafe的需要手动设置(set datefirst 1)。 另外,我的是直接返回一个串,libin_ftsafe返回的是一个table。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值