检查一周的日期是否位于两个特定的日期之间SQL ORACLE

时间:2019-05-29 12:20:57

标签: sql oracle date

我有两个日期,并且只想保留在这两个日期之间某个星期的行。我需要在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);

3 个答案:

答案 0 :(得分:4)

因此,您有两个日期间隔。一个是从input_dateinput_date + 6(请注意:6,而不是7;您也在计算input_date!)另一个是从start_dateend_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

第一部分使您连续几个星期,然后将它们与数据结合在一起,以获得所需的结果。