oracle 需要部分周查询,其中一周在一个月内,只有当周交叉下一个,那么它将考虑在下一个月的周

n8ghc7c1  于 2023-03-29  发布在  Oracle
关注(0)|答案(1)|浏览(138)

我有这样的数据:

01-05-2022 to 07-05-2022
08-05-2022 to 14-05-2022
15-05-2022 to 21-05-2022
22-05-2022 to 28-05-2022
29-05-2022 to 04-06-2022
and so on....

我想要的数据会像:-

01-05-2022 to 07-05-2022
08-05-2022 to 14-05-2022
15-05-2022 to 21-05-2022
22-05-2022 to 28-05-2022
29-05-2022 to 31-05-2022
01-06-2022 to 04-06-2022
05-06-2022 to 11-06-2022 
and so on....

第一天应该是星期天。
在这个29-05-2022到04-06-2022被认为是一个星期的平均值需要部分滑动在一周内在该特定的月份只。
将是伟大的帮助。提前感谢

niwlg2el

niwlg2el1#

您可以使用递归子查询来生成行:

WITH dates (start_date, in_month_end_date, end_date) AS (
  SELECT start_date,
         LEAST(end_date, LAST_DAY(start_date)),
         end_date
  FROM   table_name
UNION ALL
  SELECT in_month_end_date + 1,
         end_date,
         end_date
  FROM   dates
  WHERE  in_month_end_date < end_date
)
SEARCH DEPTH FIRST BY start_date SET order_id
SELECT start_date,
       in_month_end_date AS end_date
FROM   dates;

其中,对于示例数据:

CREATE TABLE table_name (start_date, end_date) AS
SELECT DATE '2022-05-01' + (LEVEL - 1) * 7,
       DATE '2022-05-01' + LEVEL * 7 - 1
FROM   DUAL
CONNECT BY LEVEL <= 6;

输出:
| 开始日期|结束日期|
| --------------|--------------|
| 2022年5月1日00时00分|2019 -05- 17 00:00:00|
| 2019 -05- 18 00:00:00|2022年5月14日00时00分|
| 2019 -05-15 00:00:00|2019 -05-21 00:00:00|
| 2019 -05-22 00:00:00|2019 -05-28 00:00:00|
| 2022年5月29日00时00分|2022年5月31日上午00时00分|
| 2022年6月1日00时00分|2019 -06- 14 00:00:00|
| 2019 -06- 15 00:00:00|2019 -06-11 00:00:00|
fiddle

相关问题