【问题标题】:Filtering Multiple Date Ranges - SQL过滤多个日期范围 - SQL
【发布时间】:2018-05-16 05:47:18
【问题描述】:

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

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

【问题讨论】:

    标签: sql oracle join not-exists


    【解决方案1】:

    您可以反转日期比较和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'
    

    【讨论】:

    • 是的,一些旧习惯很难改掉。我认为这是我在发布之前所做的,它没有给我想要的结果,但我会再试一次:)。
    • @GregN :如果不知道FULL_LIST_OF_DATES 中的记录,就很难构建或测试查询。如果上述条件不起作用,请尝试使用我以不同方式提到的OR 条件。
    • 添加了一个编辑。它拉入了不满足条件的记录。
    • 嗯...现在我明白了...这是因为两个点的 oms_name 相同,尽管它删除了故障日期,但其他条件仍然正确,因此它们也应该显示。我觉得在我的脑海里这比我做的更简单。
    • @GregN ,如果您想纯粹比较天数,请使用 TRUNC(FLD.FILTERDATE) 。默认情况下,它也会比较时间组件。
    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多