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

本文介绍了一个SQL过程,用于统计特定日期区间内各星期几的数量,并提供了一个具体的示例来展示如何使用该过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--用于统计指定日期范围内, 星期天到星期六的个数列表
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(20NOT NULL,
    
[Count]    INT
);

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

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

    
SET @DateFirst = DATEADD(day1@DateFirst);
END;

SELECT @DateFirst = DATEADD(week, DATEDIFF(week, 0@BeginDate+ 10)
    , 
@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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值