如何根据日期和周期是星期二到星期二来统计记录条数

How to count the number of records based on the date and cycle is from Tuesday to Tuesday

CREATE TABLE rpt_tab (
    e_id      NUMBER(10),
    region    VARCHAR2(20),
    stages    VARCHAR2(20),
    end_date  DATE
);

INSERT INTO rpt_tab VALUES(11,'Mumbai','STG_1','12-04-22');
INSERT INTO rpt_tab VALUES(12,'France','STG_1','13-04-22');
INSERT INTO rpt_tab VALUES(13,'France','STG_1','14-04-22');

COMMIT;

我需要编写一个逻辑,在从 end_date 列中找到最后一个星期二后给我数据。我需要一份包含以下逻辑的报告:

  1. 如果今天是 4 月 12 日,即 SYSDATE 并且那天是星期二,那么报告应该只给我今天的日期数据。
  2. 如果假设日期是 4 月 13 日,即明天的日期,那么报告应该给我 4 月 12 日(星期二)和 4 月 13 日的数据计数。 基本上,周期将从星期二到星期二。如果日期是 4 月 19 日(星期二),那么数据计数应该是从 12 日到 19 日(星期二)。
  3. 如果日期是 4 月 19 日,那么循环将继续,如第 1 点所述。 1 将检查 sysdate 是否为星期二和 sysdate 然后它会给我计数。

我的尝试:

WITH a AS(
SELECT COUNT(*) since_tuesday FROM rpt_tab
WHERE --end_date need to fetch the data count based on the end_date column and check Tuesday week day.
GROUP BY stages
)
SELECT since_tuesday FROM a;

如果日期是 4 月 12 日(星期二),则预期输出:

+--------------+
| since_tuesday |
+--------------+
|            1 |
+--------------+

如果日期是 4 月 13 日,预期输出:

+--------------+
| since_tuesday |
+--------------+
|            2 |
+--------------+

如果日期是 4 月 14 日,预期输出:

+--------------+
| since_tuesday |
+--------------+
|            3 |
+--------------+

需要检查 sysdate 是否为星期二,然后需要从那里填充计数。

您可以为此使用 NEXT_DAY() 函数:

WITH rpt_tab AS
(                            
SELECT 11 as e_id,'Mumbai' as region,'STG_1' as stages, TO_DATE('12-04-22','DD-MM-YY') as end_date FROM dual UNION ALL
SELECT 12,'France','STG_1',TO_DATE('13-04-22','DD-MM-YY') FROM dual UNION ALL
SELECT 13,'France','STG_1',TO_DATE('14-04-22','DD-MM-YY') FROM dual
)
SELECT COUNT(*) 
  FROM rpt_tab
 WHERE end_date BETWEEN TRUNC(NEXT_DAY(end_date),'TUESDAY') - 7) AND TRUNC(NEXT_DAY(end_date),'TUESDAY'))
   AND end_date <= TRUNC(SYSDATE);

而不是使用 language/territory 特定功能,如 TO_CHARNEXT_DAY,您可以独立于语言和地域使用 TRUNC(SYSDATE - 1, 'IW') + 1 将日期后移一天然后将其截断到 ISO 周的开始(始终是星期一),然后将这一天向前移动一天回到星期二:

SELECT COUNT(*) since_tuesday
FROM   rpt_tab
WHERE  end_date >= TRUNC(SYSDATE - 1, 'IW') + 1
AND    end_date <  TRUNC(SYSDATE) + 1
GROUP BY stages

其中,对于示例数据输出:

SINCE_TUESDAY
1

db<>fiddle here