我有两个日期,并且只想保留在这两个日期之间某个星期的行。我需要在67个以上的不同星期中运行此代码,因此我想更改以下代码以使其运行更快,而不必每次都键入一周中的7天。
SELECT * FROM MY_DATA
WHERE ('05-JUNE-2017' BETWEEN start_date AND end_date
OR '06-JUNE-2017' BETWEEN start_date AND end_date
OR '07-JUNE-2017' BETWEEN start_date AND end_date
OR '08-JUNE-2017' BETWEEN start_date AND end_date
OR '09-JUNE-2017' BETWEEN start_date AND end_date
OR '10-JUNE-2017' BETWEEN start_date AND end_date
OR '11-JUNE-2017' BETWEEN start_date AND end_date);
答案 0 :(得分:4)
因此,您有两个日期间隔。一个是从input_date
到input_date + 6
(请注意:6,而不是7;您也在计算input_date
!)另一个是从start_date
到end_date
。并且您要编写一个条件,表示两个间隔重叠(具有非空交集)。
如果一个间隔完全位于另一个间隔之前,则两个间隔不会不重叠。因此,一个间隔的最后一天必须严格小于另一个间隔的第一天。这可以通过以下两种方式之一发生(取决于哪个间隔最先出现)。条件看起来像这样:
input_date + 6 < start_date OR end_date < input_date
因此,这是您想要的条件的否定。将逻辑NOT
应用于此;因此条件变为:
input_date + 6 >= start_date AND end_date >= input_date
答案 1 :(得分:0)
我认为您的查询等同于
SELECT * FROM MY_DATA WHERE ('05-JUNE-2017' BETWEEN start_date - 6 AND end_date );
其中'05-JUNE-2017'
是您要查找的一周的第一天。
现在,您必须在最初的所有工作日中执行此操作...
您正在寻找什么吗?
答案 2 :(得分:0)
我认为您正在寻找类似以下的内容:
WITH weeks AS (SELECT TO_DATE('05-07-2017', 'DD-MM-RRRR') + LEVEL * 7 - 7 week_start
, TO_DATE('05-07-2017', 'DD-MM-RRRR') + LEVEL * 7 - 1 week_end
FROM dual
CONNECT BY LEVEL < 50)
SELECT *
FROM MY_DATA
JOIN WEEKS
ON MY_DATA.end_date >= weeks.week_start
AND MY_DATA.start_date <= weeks.week_end
第一部分使您连续几个星期,然后将它们与数据结合在一起,以获得所需的结果。