按季度的周分组日期

时间:2020-07-16 10:55:39

标签: c# sql sql-server

我试图将几周分成几个季度。宿舍定义:

1 Jan - 31MAR
1 APR - 30JUN
1 JUL - 30SEP
1 OCT - 31DEC

我尝试使用weekOfYear进行分组,但是我不知道如何从weekOfYear int值获取星期的开始和结束。

下面是示例日期的列表。如果一个星期重叠一个季度,我想缩短它。例如,该季度的最后一周可能是6月28日至30日。

这是我尝试实现的格式。几周必须从季度开始:

1-7 Jan
8-14 Jan
15-21 Jan
22-28 Jan
29-4 FEB
5-11 FEB
12-18 FEB
19-25 FEB
26-3 MAR
4-10 MAR
11-17 MAR
18-24 MAR
25-31 MAR

我正在尝试将日期列表与帐单金额进行分组,如下所示:

Invoice Issued Date       cost
2020-01-01 00:00:00.000 18259.00
2020-01-08 00:00:00.000 35374.00
2020-01-15 00:00:00.000 19793.00
2020-01-22 00:00:00.000 91014.00
2020-02-02 00:00:00.000 23252.00
2020-02-09 00:00:00.000 34628.00
2020-02-16 00:00:00.000 48214.00
2020-02-23 00:00:00.000 9146.00
2020-03-03 00:00:00.000 20234.00

如果这在SQL Server中更容易实现,那么我也对此持开放态度。

1 个答案:

答案 0 :(得分:0)

您可以按照以下说明完全在SQL中完成此操作。

我可以自由地通过将月份数除以4来定义四分之一。

(DATEPART(MONTH, [Date]) / 4) + 1

很明显,如果这不适合您,则可以用所需的逻辑替换它。

-- Table Structure
CREATE TABLE Invoice (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Date DATE NOT NULL,
    Amount DECIMAL(6,2) NOT NULL
);
GO

-- Sample Data (1000 rows)
;WITH CTE_1000 AS (
    SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY object_id) r
    FROM sys.all_objects
)
INSERT INTO Invoice (Date, Amount)
SELECT
    DATEADD(DAY, r - 1, '20200101'),
    ROUND(RAND(CHECKSUM(NEWID())) * 1000, 2)
FROM CTE_1000;
GO

-- Aggregate Query
;WITH CTE_Quarters AS (
    SELECT
        DATEPART(YEAR, [Date]) [Year],
        (DATEPART(MONTH, [Date]) / 4) + 1 [Quarter],
        [Amount]
    FROM [Invoice]
)
SELECT
    [Year],
    [Quarter],
    SUM([Amount]) [SumAmount]
FROM CTE_Quarters
GROUP BY [Year], [Quarter]
ORDER BY [Year], [Quarter];

SQL小提琴在这里:http://sqlfiddle.com/#!18/73778/3