我有一个要求
START_DATE:2018 年 3 月 1 日
END_DATE:2018 年 1 月 31 日
我需要一个查询,它将列出这两个日期之间的所有周的开始日期和结束日期,如下所示
StartWeek EndWeek
03/01/2018 04/01/2018
07/01/2018 11/01/2018
14/01/2018 18/01/2018
21/01/2018 25/01/2018
28/01/2018 31/01/2018
这里的工作日是从周日到周四。一周从周日开始
最佳答案
试试这个,
CREATE OR REPLACE PACKAGE week_pkg
AS
TYPE week_rec IS RECORD (start_week DATE, end_week DATE);
TYPE week_tab IS TABLE OF week_rec;
FUNCTION get_weeks (p_start_date DATE, p_end_date DATE) RETURN week_tab PIPELINED;
END;
/
CREATE OR REPLACE PACKAGE BODY week_pkg
AS
FUNCTION get_weeks (p_start_date DATE, p_end_date DATE) RETURN week_tab PIPELINED
IS
v_date DATE;
v_week_rec week_rec;
BEGIN
v_date := p_start_date - 7;
LOOP
v_week_rec.start_week := NEXT_DAY(v_date, 'SUNDAY');
IF v_week_rec.start_week < p_start_date THEN
v_week_rec.start_week:= p_start_date;
END IF;
v_week_rec.end_week := NEXT_DAY(v_date, 'THURSDAY');
IF v_week_rec.end_week >= p_end_date THEN
v_week_rec.end_week := p_end_date;
PIPE ROW (v_week_rec);
EXIT;
ELSIF v_week_rec.end_week <= p_start_date THEN
v_week_rec.end_week := NEXT_DAY(v_week_rec.start_week, 'THURSDAY');
END IF;
v_date := v_week_rec.end_week;
PIPE ROW (v_week_rec);
END LOOP;
END;
END;
/
SELECT *
FROM table(week_pkg.get_weeks(to_date('03-JAN-2018', 'DD-MON-YYYY'), to_date('31-JAN-2018', 'DD-MON-YYYY')));
输出:
START_WEEK END_WEEK
---------- ---------
03-JAN-18 04-JAN-18
07-JAN-18 11-JAN-18
14-JAN-18 18-JAN-18
21-JAN-18 25-JAN-18
28-JAN-18 31-JAN-18
关于sql - Oracle SQL 查询列出两个日期之间的周数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48146492/