如何根据日期和周期是星期二到星期二来统计记录条数
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
列中找到最后一个星期二后给我数据。我需要一份包含以下逻辑的报告:
- 如果今天是 4 月 12 日,即
SYSDATE
并且那天是星期二,那么报告应该只给我今天的日期数据。
- 如果假设日期是 4 月 13 日,即明天的日期,那么报告应该给我 4 月 12 日(星期二)和 4 月 13 日的数据计数。
基本上,周期将从星期二到星期二。如果日期是 4 月 19 日(星期二),那么数据计数应该是从 12 日到 19 日(星期二)。
- 如果日期是 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_CHAR
或 NEXT_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
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
列中找到最后一个星期二后给我数据。我需要一份包含以下逻辑的报告:
- 如果今天是 4 月 12 日,即
SYSDATE
并且那天是星期二,那么报告应该只给我今天的日期数据。 - 如果假设日期是 4 月 13 日,即明天的日期,那么报告应该给我 4 月 12 日(星期二)和 4 月 13 日的数据计数。 基本上,周期将从星期二到星期二。如果日期是 4 月 19 日(星期二),那么数据计数应该是从 12 日到 19 日(星期二)。
- 如果日期是 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_CHAR
或 NEXT_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