sql - Oracle SQL 查询列出两个日期之间的周数

标签 sql oracle date between

我有一个要求

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/

相关文章:

sql - SELECT (* - some_columns) FROM TABLE 在 SQL 中

sql - Oracle SQL唯一约束A到B,B到A

java - 同一笔交易能否保证数据可见性

Java 8 文档日期时间教程错误

javascript - 无法将数据 '19-10-2002' 转换为日期

sql - 数据库中聊天消息和评论的典型长度是多少?

mysql - 按序列号分组的日期选择最新条目

java - 缓存数据库中的序列以减少数据库调用

mysql - 使用 shell 脚本从 csv 文件批量复制到 OracleDB

sql - 如何在日期时间列上连接 postgresql 中的两个表,并在一个唯一的列中显示日期时间的所有寄存器?