按季度周分组日期

0kjbasz6  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(318)

我试着把几个星期分成几个季度。季度定义如下:

  1. 1 Jan - 31MAR
  2. 1 APR - 30JUN
  3. 1 JUL - 30SEP
  4. 1 OCT - 31DEC

我试过用weekofyear来分组哪个有效,但是我不知道如何从weekofyear int值中得到一周的开始和结束。
下面是一个样本日期列表。如果一个星期和一个季度重叠,我想缩短时间。e、 g本季度最后一周可能是6月28日至30日。
这是我想要达到的形式。周必须从季度开始:

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

我试图将一个日期列表与账单金额分组如下:

  1. Invoice Issued Date cost
  2. 2020-01-01 00:00:00.000 18259.00
  3. 2020-01-08 00:00:00.000 35374.00
  4. 2020-01-15 00:00:00.000 19793.00
  5. 2020-01-22 00:00:00.000 91014.00
  6. 2020-02-02 00:00:00.000 23252.00
  7. 2020-02-09 00:00:00.000 34628.00
  8. 2020-02-16 00:00:00.000 48214.00
  9. 2020-02-23 00:00:00.000 9146.00
  10. 2020-03-03 00:00:00.000 20234.00

如果这在SQLServer中更容易实现的话,我也愿意这样做。

4zcjmb1e

4zcjmb1e1#

您可以完全在sql中这样做,如下所示。
我冒昧地用月份数除以4来定义季度。

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

显然,如果这不适合你,那么你可以用你需要的任何逻辑来代替它。

  1. -- Table Structure
  2. CREATE TABLE Invoice (
  3. Id INT IDENTITY(1,1) PRIMARY KEY,
  4. Date DATE NOT NULL,
  5. Amount DECIMAL(6,2) NOT NULL
  6. );
  7. GO
  8. -- Sample Data (1000 rows)
  9. ;WITH CTE_1000 AS (
  10. SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY object_id) r
  11. FROM sys.all_objects
  12. )
  13. INSERT INTO Invoice (Date, Amount)
  14. SELECT
  15. DATEADD(DAY, r - 1, '20200101'),
  16. ROUND(RAND(CHECKSUM(NEWID())) * 1000, 2)
  17. FROM CTE_1000;
  18. GO
  19. -- Aggregate Query
  20. ;WITH CTE_Quarters AS (
  21. SELECT
  22. DATEPART(YEAR, [Date]) [Year],
  23. (DATEPART(MONTH, [Date]) / 4) + 1 [Quarter],
  24. [Amount]
  25. FROM [Invoice]
  26. )
  27. SELECT
  28. [Year],
  29. [Quarter],
  30. SUM([Amount]) [SumAmount]
  31. FROM CTE_Quarters
  32. GROUP BY [Year], [Quarter]
  33. ORDER BY [Year], [Quarter];

sql小提琴:http://sqlfiddle.com/#!18/73778/3

展开查看全部

相关问题