sql - 在没有循环的情况下计算两个日期之间一周中的每一天

标签 sql sql-server tsql

我可以用循环来做,但如果很多天很慢。所以我需要没有循环。 这是我的代码:

     DECLARE
         @FRDT date = '01-SEP-2019'
        ,@TODT date = '30-SEP-2019'
        ,@N int

        ,@SUN int = 0
        ,@MON int = 0
        ,@TUE int = 0
        ,@WED int = 0
        ,@THU int = 0
        ,@FRI int = 0
        ,@SAT int = 0

    WHILE @FRDT <= @TODT
    BEGIN
        SET @N = DATEPART(WEEKDAY, @FRDT)
        IF @N = 1
            SET @SUN = @SUN + 1
        ELSE IF @N = 2
            SET @MON = @MON + 1
        ELSE IF @N = 3
            SET @TUE = @TUE + 1
        ELSE IF @N = 4
            SET @WED = @WED + 1
        ELSE IF @N = 5
            SET @THU = @THU + 1
        ELSE IF @N = 6
            SET @FRI = @FRI + 1
        ELSE IF @N = 7
            SET @SAT = @SAT + 1

        SET @FRDT = DATEADD(DAY, 1, @FRDT)
    END

    SELECT 1 AS [NO], 'Sunday' AS [DAYNAME], @SUN AS [NUMBEROFDAY]
    UNION SELECT 2, 'Monday', @MON
    UNION SELECT 3, 'Tuesday', @TUE
    UNION SELECT 4, 'Wednesday', @WED
    UNION SELECT 5, 'Thursday', @THU
    UNION SELECT 6, 'Friday', @FRI

enter image description here

我想要像上面的代码一样的结果,但不使用循环以获得更好的性能。

最佳答案

日期范围是 30 天,除以 7 得到商 4 余数 2。

所以一周中的每一天都得到 4,两天需要额外的一天。这些是对应于 @start_date 和本例中的第二天。

实现此方法的 SQL 如下 ( demo )

SELECT DATENAME(WEEKDAY,base_date),
       quotient + IIF(Nums.N < remainder, 1, 0)
FROM (VALUES 
         (0),
         (1),
         (2),
         (3),
         (4),
         (5),
         (6)) Nums(N)
CROSS APPLY(SELECT 1 + DATEDIFF(DAY,@start_date,@end_date)) DC(day_count)
CROSS APPLY(SELECT DATEADD(DAY, Nums.N, @start_date), day_count/7, day_count% 7) D(base_date, quotient, remainder)
ORDER BY DATEPART(DW,base_date)

关于sql - 在没有循环的情况下计算两个日期之间一周中的每一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921902/

相关文章:

java - Android Studio 使用应用程序部署文件

sql - 将标识列值从另一个表插入到表中?

sql - 在 select 子句中包含 nvarchar(max) 列会显着增加执行时间

sql-server - 奇怪的 WHERE col = NULL 行为

sql - 如何在 SQL Server 中获取查询执行计划?

mysql - 加快 rails 查询速度

mysql - 我如何在mysql中使用左连接

sql-server - 更新非聚集索引有时会在 dm_db_index_usage_stats 中注册 SEEK 吗?

sql-server - SQL Server 上 DISTINCT 造成巨大性能损失的解决方法?

SQL Case 语句在 where 子句中指定条件?