当季度在周中开始时,如何确定季度的周数?

时间:2019-01-08 22:55:28

标签: sql oracle plsql

我需要部分查询的帮助。我正在尝试准确计算2列。在第一列中,我试图根据通话日期计算会计季度的周数。在第二列中,我想要汇总该特定星期的开始日期和结束日期。

我使用了以下查询,它在过去的两个季度中都运行良好,但是现在它不再能正常运行,我想这是因为当前季度从星期二(1/1/2019)开始。

, 1 + TRUNC((CALL_DATE - TRUNC(CALL_DATE, 'Q'))/7) as "Week in Quarter"
, TO_CHAR(TRUNC(CALL_DATE, 'IW'), 'MM/DD/YY') ||' - '|| TO_CHAR(TRUNC(CALL_DATE, 'IW') + 4, 'MM/DD/YY') as  "Week Dates"

对于在星期一(2019年1月7日)完成的通话,这反映为“季度季度”列中的“周1”,实际上应视为“周2”。

此外,“周日期”列将该季度的第一周标记为“ 12/31/18-01/04/19”,而我希望将其设置为“ 01/01/19-01 / 04/19'。

无论该季度开始于哪个工作日,我如何更改此代码以使其适用于所有财政季度?几乎就像我需要一个案例来计算季度的第一周不同吗?

2 个答案:

答案 0 :(得分:1)

您可以使用( TRUNC( call_date, 'IW' ) - TRUNC( TRUNC( call_date, 'Q' ), 'IW' ) ) / 7 + 1查找该季度的星期几。

Oracle设置

CREATE TABLE table_name ( call_date ) AS
SELECT DATE '2018-12-20' + LEVEL - 1
FROM DUAL
CONNECT BY LEVEL <= 20;

查询

SELECT call_date,
       ( TRUNC( call_date, 'IW' ) - TRUNC( TRUNC( call_date, 'Q' ), 'IW' ) ) / 7 + 1 
         AS week_of_quarter,
       GREATEST(
         TRUNC( call_date, 'IW' ),
         TRUNC( call_date, 'Q' )
       ) AS start_of_quarter_week,
       LEAST(
         TRUNC( call_date, 'IW' ) + INTERVAL '6' DAY,
         ADD_MONTHS( TRUNC( call_date, 'Q' ), 3 ) - INTERVAL '1' DAY
       ) AS end_of_quarter_week
FROM   table_name;

输出

CALL_DATE | WEEK_OF_QUARTER | START_OF_QUARTER_WEEK | END_OF_QUARTER_WEEK
:-------- | --------------: | :-------------------- | :------------------
20-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
21-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
22-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
23-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
24-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
25-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
26-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
27-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
28-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
29-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
30-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
31-DEC-18 |              14 | 31-DEC-18             | 31-DEC-18          
01-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
02-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
03-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
04-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
05-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
06-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
07-JAN-19 |               2 | 07-JAN-19             | 13-JAN-19          
08-JAN-19 |               2 | 07-JAN-19             | 13-JAN-19          

db <>提琴here

答案 1 :(得分:0)

对于SQL Server / T-SQL,您可以使用此代码获取季度的星期。

1+(DATEPART(WW,[call_date])-DATEPART(WW,DATEADD(QQ,DATEDIFF(QQ,0,[call_date]),0)))