用SQL语句写某一月份的日历


在SQL2005下实现很方便,这里用的是CTE和Pivot,方法如下:

Use  Test
go
Set  Nocount  On
Declare  
    
@Date   datetime ,
    
@StartDate   datetime ,
    
@EndDate   datetime ,
    
@FirstIndex   int

Set   @Date   = ' 20080222 '   -- 输入一个日期,即可算出当月的日历

Select  
    
@StartDate = Convert ( char ( 6 ), @Date , 112 ) + ' 01 '
    
@EndDate = Dateadd ( month , 1 , @StartDate ) - 1 ,
    
@FirstIndex = Datediff ( day , - 1 , @StartDate ) % 7

;
With  t  As
(
    
Select  Date = Convert ( int , 1 ),Row = ( @FirstIndex ) / 7 ,Col = @FirstIndex
    
Union   All
    
Select  Date = Date + 1 ,Row = ( @FirstIndex + Date) / 7 ,Col = (Date + @FirstIndex ) % 7
    
From  t
    
Where  Date <= Datediff ( day , @StartDate , @EndDate )
)
Select  
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 0 ] ), '' ),
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 1 ] ), '' ),
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 2 ] ), '' ),
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 3 ] ), '' ),
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 4 ] ), '' ),
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 5 ] ), '' ),
    
[ ] = Isnull ( Convert ( char ( 2 ), [ 6 ] ), '' )
From  t
Pivot (
Max (Date)  For  col  In ( [ 0 ] , [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] , [ 5 ] , [ 6 ] )) b

/*
2008年2月份
------------
日    一    二   三   四   五   六
---- ---- ---- ---- ---- ---- ----
                              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     
*/


2006年写的一个,虽然能实现,但很土,o(∩_∩)o...:

/*
功能:绘画日历
设计:OK_008
时间:2006-05
*/
DECLARE   @Year   nvarchar ( 4 )
DECLARE   @YearMonth   nvarchar ( 7 )     -- 月份
DECLARE   @strTop   nvarchar ( 200 )
DECLARE   @ForI   INT , @ForYear   INT  , @MaxDay   INT
DECLARE   @RowX   INT   -- 行位置 
DECLARE   @strWeekDayList   nvarchar ( 20 )
DECLARE   @strPrint   nvarchar ( 300 )

--  ======================================
SET   @Year = ' 2006 '      -- 请在这里输入年份
--
 ======================================
SET   @strTop =   ' ' + char ( 9 ) + ' ' + char ( 9 ) + ' '   + char ( 9 ) + ' ' ++ char ( 9 ) + ' ' ++ char ( 9 ) + ' ' ++ char ( 9 ) + ' '   + char ( 13 ) +
         
' ─────────────────────────── '
SET   @strWeekDayList = ' 日一二三四五六 '
SET   @ForYear = 1
WHILE   @ForYear <= 12    -- 1月份至12月份
  BEGIN
    
SET   @YearMonth = @Year   +   ' - '   + CAST @ForYear   AS   nvarchar ( 2 ))
    
SET   @MaxDay = DAY ( DATEADD ( Day , - 1 , DATEADD ( Month , 1 , @YearMonth + ' -01 ' )))
    
SET   @RowX = CHARINDEX ( RIGHT ( DATENAME (WeekDay, @YearMonth + ' -01 ' ), 1 ), @strWeekDayList ) - 1
    
SET   @strPrint = ''
    
SET   @ForI = 1
    
WHILE   @ForI <= @RowX      -- 构造1号的位置
          BEGIN
        
SET   @strPrint = @strPrint + CHAR ( 9 )
        
SET   @ForI = @ForI + 1
         
END
    
SET   @ForI = 1
    
WHILE   @ForI <= @MaxDay      -- 构造2号到月底的位置
          BEGIN
        
SET   @strPrint = @strPrint + CAST ( @ForI   AS   nvarchar ( 2 ))  + Char ( 9 )    
        
SET   @RowX = @RowX + 1
        
SET   @ForI = @ForI + 1
        
IF  ( @RowX % 7 = 0 )
           
BEGIN
            
SET   @RowX = 0  
            
SET   @strPrint = @strPrint + CHAR ( 13 )
             
END
       
END
    
SET   @ForYear = @ForYear + 1
    
--  打印输出一个月的结果
     PRINT   ' ━━━━━━━━━━━━━━━━━━━━━━━━━━━ '
    
PRINT   + Char ( 9 ) ++ Char ( 9 ) + '      ' + @YearMonth + CHAR ( 10 )
    
PRINT   @strTop
    
PRINT   @strPrint   + CHAR ( 10 )
  
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值