过滤多个日期范围 - SQL

时间:2017-12-02 05:31:59

标签: sql oracle join not-exists

如果日期在日期范围内,我试图从表中排除数据。如果这是一个单一的日期,那么这将是一个简单的:

SELECT * FROM XYZ WHERE XYZ.DATE NOT BETWEEN DATE1 AND DATE2;

但是对于这个特定的要求,我有很多日期我希望与一个单独的表进行比较(EXCLUDE_THESE_DATES):

START_DATE          END_DATE            VALUE_NAME
06-NOV-17 13:16:00  06-NOV-17 13:17:00  NAMEINQUESTION
06-NOV-17 16:34:00  17-NOV-17 16:13:00  NAMEINQUESTION
13-NOV-17 18:05:00  13-NOV-17 18:10:00  NAMEINQUESTION
13-NOV-17 20:02:00  13-NOV-17 20:03:00  NAMEINQUESTION
13-NOV-17 20:05:00  13-NOV-17 20:20:00  NAMEINQUESTION
15-NOV-17 15:14:00  15-NOV-17 15:18:00  NAMEINQUESTION

我能够获得那些日期(下面)中的所有值,但似乎没有什么能让我得到我真正想要的东西(日期不在那些日期范围内)。

SELECT
 FLD.VALUE, FLD.FILTERDATE, ETED.START_DATE, ETED.END_DATE
FROM 
  FULL_LIST_OF_DATES FLD,
  EXCLUDE_THESE_DATES ETD
WHERE FLD.VALUE_NAME = ETD.VALUE_NAME
AND FLD.VALUE_TYPE_ID = 1007
AND FLD.FILTERDATE BETWEEN '01-OCT-17 00:00:00' AND '01-APR-18 
00:00:00'
AND (FLD.FILTERDATE >= ETED.START_DATE 
AND  FLD.FILTERDATE <= ETED.END_DATE)
AND FLD.VALUE_NAME = 'NAMEINQUESTION'

任何帮助都将不胜感激!

编辑: 结果基于反馈。 16:34:51不应该出现,因为它也是在06-NOV-17 16:34:00到17-NOV-17 16:13:00。

VALUE       FILTERDATE          START_DATE          END_DATE
480.703461  06-NOV-17 16:34:51  28-NOV-17 13:26:00  29-NOV-17 23:36:00
480.703461  06-NOV-17 16:34:51  13-NOV-17 18:05:00  13-NOV-17 18:10:00
480.703461  06-NOV-17 16:34:51  06-NOV-17 13:16:00  06-NOV-17 13:17:00
480.703461  06-NOV-17 16:34:51  13-NOV-17 20:05:00  13-NOV-17 20:20:00
480.703461  06-NOV-17 16:34:51  15-NOV-17 15:14:00  15-NOV-17 15:18:00
480.703461  06-NOV-17 16:34:51  28-NOV-17 13:10:00  28-NOV-17 13:13:00
480.703461  06-NOV-17 16:34:51  13-NOV-17 20:02:00  13-NOV-17 20:03:00
483.04837   06-NOV-17 16:35:19  28-NOV-17 13:26:00  29-NOV-17 23:36:00
483.04837   06-NOV-17 16:35:19  13-NOV-17 18:05:00  13-NOV-17 18:10:00
483.04837   06-NOV-17 16:35:19  06-NOV-17 13:16:00  06-NOV-17 13:17:00
483.04837   06-NOV-17 16:35:19  13-NOV-17 20:05:00  13-NOV-17 20:20:00
483.04837   06-NOV-17 16:35:19  15-NOV-17 15:14:00  15-NOV-17 15:18:00
483.04837   06-NOV-17 16:35:19  28-NOV-17 13:10:00  28-NOV-17 13:13:00

1 个答案:

答案 0 :(得分:0)

您可以撤消日期比较和OR条件,而不是AND

此外,使用JOIN ..ON语法而不是旧a,b

SELECT
 FLD.VALUE, FLD.FILTERDATE, ETED.START_DATE, ETED.END_DATE
FROM 
  FULL_LIST_OF_DATES FLD JOIN 
  EXCLUDE_THESE_DATES ETD
  ON  FLD.VALUE_NAME = ETD.VALUE_NAME
WHERE FLD.VALUE_TYPE_ID = 1007
AND FLD.FILTERDATE BETWEEN '01-OCT-17 00:00:00' AND '01-APR-18 
00:00:00'
AND ( FLD.FILTERDATE < ETED.START_DATE 
         OR  FLD.FILTERDATE > ETED.END_DATE)
AND FLD.VALUE_NAME = 'NAMEINQUESTION'