统计星期次数的SQL Server存储过程

-- 用于统计指定日期范围内, 星期天到星期六的个数列表
IF   EXISTS  ( SELECT   *   FROM  dbo.sysobjects  WHERE  id  =   OBJECT_ID (N ' [dbo].[usp_GetWeekDayCount] ' AND   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
DROP   PROC   [ dbo ] . [ usp_GetWeekDayCount ]
GO

CREATE   PROC   [ dbo ] . [ usp_GetWeekDayCount ]
    
@BeginDate   DATETIME @EndDate   DATETIME
AS
SET  NOCOUNT  ON ;

DECLARE   @WeekDay   TABLE
(
    
[ Index ]   TINYINT   NOT   NULL   PRIMARY   KEY ,
    
[ Name ]   NVARCHAR ( 20 NOT   NULL ,
    
[ Count ]      INT
);

DECLARE   @DateFirst   DATETIME @DateLast   DATETIME ;
SELECT   @DateFirst   =   DATEADD (week,  DATEDIFF (week,  0 GETDATE ()),  0 )
    , 
@DateLast   =   DATEADD (week,  DATEDIFF (week,  0 GETDATE ())  +   1 0 );

WHILE   @DateFirst   <   @DateLast
BEGIN
    
INSERT   INTO   @WeekDay ( [ Index ] [ Name ] [ Count ] )
    
VALUES  ( DATEPART (weekday,  @DateFirst ),  DATENAME (weekday,  @DateFirst ),  0 );

    
SET   @DateFirst   =   DATEADD ( day 1 @DateFirst );
END ;

SELECT   @DateFirst   =   DATEADD (week,  DATEDIFF (week,  0 @BeginDate +   1 0 )
    , 
@DateLast   =   DATEADD (week,  DATEDIFF (week,  0 @EndDate ),  0 );
IF   @DateLast   <   @DateFirst
    
UPDATE   @WeekDay
    
SET   [ Count ]   =   [ Count ]   +   1
    
WHERE   [ Index ]   >=   DATEPART (weekday,  @BeginDate )
        
AND   [ Index ]   <=   DATEPART (weekday,  @EndDate );
ELSE
BEGIN
    
UPDATE   @WeekDay
    
SET   [ Count ]   =   [ Count ]   +   DATEDIFF ( day @DateFirst @DateLast /   7 ;

    
UPDATE   @WeekDay
    
SET   [ Count ]   =   [ Count ]   +   1
    
WHERE   [ Index ]   >=   DATEPART (weekday,  @BeginDate );

    
UPDATE   @WeekDay
    
SET   [ Count ]   =   [ Count ]   +   1
    
WHERE   [ Index ]   <=   DATEPART (weekday,  @EndDate );
END ;

-- 与.NET星期索引统一(0-6)
UPDATE   @WeekDay
SET   [ Index ]   =   [ Index ]   -   1 ;

SELECT   *
FROM   @WeekDay ;

SET  NOCOUNT  OFF ;
GO

 

调用示例:

EXEC  usp_GetWeekDayCount  ' 2007-04-01 ' ' 2007-04-30 '

 结果:
Index Name                 Count      
----- -------------------- -----------
0     Sunday               5
1     Monday               5
2     Tuesday              4
3     Wednesday            4
4     Thursday             4
5     Friday               4
6     Saturday             4

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值