【问题标题】:Oracle Set operator queryOracle 集合算子查询
【发布时间】:2011-07-21 06:37:13
【问题描述】:

在 Oracle 11g 上进行 SQL 查询,该查询返回表中 +/- 15 分钟范围内是否存在具有特定 ID 和状态的记录的计数。

现在我希望通过添加类似AND TIMESTAMP < trunc(sysdate) 的条件来忽略当前日期。
但是,对于今天存在记录的情况,我希望忽略查询'2010-07-20 19:15:11' >= TO_CHAR(TIMESTAMP - (1/1440*15), 'YYYY-MM-DD HH24:MI:SS') AND '2010-07-20 19:15:11' <= (TO_CHAR(TIMESTAMP + (1/1440*15), 'YYYY-MM-DD HH24:MI:SS'))中的日期比较检查@

SELECT count(1) AS COUNT 
FROM MASTER_ONE 
WHERE ID='123' AND STATUS= 'ACTIVE' 
AND '2010-07-20 19:15:11' >= TO_CHAR(TIMESTAMP - (1/1440*15), 'YYYY-MM-DD HH24:MI:SS') 
AND '2010-07-20 19:15:11' <= (TO_CHAR(TIMESTAMP + (1/1440*15), 'YYYY-MM-DD HH24:MI:SS')) 
UNION ALL 
SELECT count(1) AS COUNT 
FROM MASTER_TWO 
WHERE ID='321' AND STATUS= 'ACTIVE' 
AND '2010-07-20 19:15:11' >= TO_CHAR(TIMESTAMP - (1/1440*15), 'YYYY-MM-DD HH24:MI:SS') 
AND '2010-07-20 19:15:11' <= (TO_CHAR(TIMESTAMP + (1/1440*15), 'YYYY-MM-DD HH24:MI:SS'))

我该怎么做?

【问题讨论】:

  • 我不完全理解你的问题。您的时间戳列是 DATE 列?在哪些情况下,您需要忽略比较? sysdate 条件在哪里?
  • 是的 - 时间戳列是日期列。如果是今天,我想忽略输入日期应在时间戳列日期的 +-15 分钟内的比较。

标签: sql timestamp oracle11g set-operations


【解决方案1】:

您的查询的第一个问题是您正在对日期进行字符串比较。使用to_date 而不是to_char,让Oracle 帮助您。

SELECT   
    to_date('2010-07-20 19:15:11', 'YYYY-MM-DD HH24:MI:SS') AS orig_date
  , to_date('2010-07-20 19:15:11', 'YYYY-MM-DD HH24:MI:SS') - 1 / 24 / 4 AS fifteen_min_prior
  , to_date('2010-07-20 19:15:11', 'YYYY-MM-DD HH24:MI:SS') + 1 / 24 / 4 AS fifteen_min_after
FROM dual;

输出:

ORIG_DATE                 FIFTEEN_MIN_PRIOR         FIFTEEN_MIN_AFTER         
------------------------- ------------------------- ------------------------- 
20-JUL-10 07:15:11 PM     20-JUL-10 07:00:11 PM     20-JUL-10 07:30:11 PM     

然后使用可以在谓词中的BETWEEN 条件中使用这些日期。见Oracle date "Between" Query。

我不太清楚您所说的“但是,对于今天存在记录的情况,我希望忽略查询中的日期比较检查。”您刚刚写过要排除当天的值。要么排除今天的记录,要么不排除。

【讨论】:

    【解决方案2】:

    好的,如果我理解正确的话,你可以试试这样的:

    SELECT count(1) AS COUNT 
    FROM MASTER_ONE 
    WHERE ID='123' AND STATUS= 'ACTIVE' 
    AND (timestamp > trunc(sysdate) 
      OR (timestamp < trunc(sysdate) 
      AND timestamp BETWEEN to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') - (1/1440*15) 
                        AND to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') + (1/1440*15)))
    UNION ALL
    SELECT count(1) AS COUNT 
    FROM MASTER_TWO 
    WHERE ID='321' AND STATUS= 'ACTIVE' 
    AND (timestamp > trunc(sysdate) 
      OR (timestamp < trunc(sysdate) 
      AND timestamp BETWEEN to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') - (1/1440*15) 
                        AND to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') + (1/1440*15)))
    

    在此选择中,如果您的时间戳列的日期早于 sysdate,则仅应用 15 分钟条件。

    【讨论】:

    • 我为您清理了代码格式,因此完整查询的语法突出显示。但是,虽然此查询正确显示了执行 OP 请求所需的 AND 和 ORs 的组合(并正确使用 to_date 和 BETWEEN 而不是 to_char),但我认为 OP 实际上是混淆了在 UNION ALL 的标题和用法中提到“集合运算符”的问题。我不确定,但我认为他的联合可能是为了满足 AND/OR 的需求......虽然我确实看到查询中的表和 ID 发生了变化,所以谁知道呢。无论哪种方式,问题、标题和查询都是模棱两可的。
    • 感谢您的清洁.. :)
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多