如果日期在日期范围内,我试图从表中排除数据。如果这是一个单一的日期,那么这将是一个简单的:
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
答案 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'