【问题标题】:Group Dates By Weeks Of Quarter按季度的周分组日期
【发布时间】:2020-07-17 00:10:32
【问题描述】:

我正在尝试将周分组为季度。定义季度:

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 中更容易实现,我也愿意。

【问题讨论】:

  • 请定义“季度”的含义。同时标记您正在使用的数据库。
  • @scaisEdge 问题刚刚更新
  • 一个季度从一周中的哪一天开始?今年的第一天是星期三。通常一夸脱的开始是一周的开始,例如周日或周一。
  • 可能是SqlFunctions.DatePart 可以在这里帮忙docs.microsoft.com/en-us/dotnet/api/…
  • jdweng 如果是这样的话会更容易。一年的第一天是 1 月 1 日。不是一周中的固定日期

标签: c# sql sql-server


【解决方案1】:

您可以完全在 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

【讨论】:

  • 谢谢克里斯。这给出了季度,但我试图按季度的周分组
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2018-10-15
  • 2012-10-19
  • 2012-01-23
  • 2010-10-29
  • 2023-03-09
相关资源
最近更新 更多