PL/SQL—在“where”子句中使用条件语句在两个日期之间运行

PL/SQL—在“where”子句中使用条件语句在两个日期之间运行,sql,oracle,oracle11g,where,Sql,Oracle,Oracle11g,Where,请原谅我对PL/SQL的了解非常有限 我试图在where子句中使用条件语句。 我有一个脚本,它将在run_date介于今天和昨天之间的地方运行,但是如果一周的某一天是星期一,它应该在run_date介于今天-3和今天-2之间的地方运行 我认为问题在于我试图应用的条件语句,我试图使用下面的CASE语句示例,但它只返回一个值,而我需要返回一种方法,告诉脚本在两个日期之间运行 代码- 在那里我试图实施案例陈述 select record_type a, count(record_type) b fro

请原谅我对PL/SQL的了解非常有限

我试图在where子句中使用条件语句。 我有一个脚本,它将在run_date介于今天和昨天之间的地方运行,但是如果一周的某一天是星期一,它应该在run_date介于今天-3和今天-2之间的地方运行

我认为问题在于我试图应用的条件语句,我试图使用下面的CASE语句示例,但它只返回一个值,而我需要返回一种方法,告诉脚本在两个日期之间运行

代码- 在那里我试图实施案例陈述

select record_type a, count(record_type) b
from orf_po_data
where
 (CASE 
   WHEN ((to_char(sysdate, 'D')) = '1') THEN (between trunc(sysdate-3) and trunc(sysdate-2))
   WHEN ((to_char(sysdate, 'D')) > '1' and (to_char(sysdate, 'D')) <= '5') THEN (between trunc(sysdate-1) and trunc(sysdate)
   ELSE null
END) run_date

group by record_type
order by record_type
如果有人需要更多信息,请随时询问,我会告诉你我所知道的,尽管我对这种环境的经验非常有限

谢谢,

您可以用一些布尔逻辑重写WHERE条件;如果我理解清楚,您可能需要:

WHERE ( to_char(sysdate, 'D') = '1' AND
        run_date between sysdate-1 and sysdate
      )
      OR
      ( to_char(sysdate, 'D') != '1' AND
        run_date between sysdate-3 and sysdate -2
      )
您编写的代码使用CASE,这不是一个坏主意,但将其用作语句,而不提供返回值,而不是将其用作表达式来计算值,将其值与其他数据进行比较。 然而,我更喜欢让我的条件尽可能清晰,所以我通常尝试用布尔逻辑来编写它们;这当然是我自己的观点,不考虑性能

请考虑我只是修改了你的条件,假设它们是正确的;例如,如果你需要根据天,甚至不是小时,分钟,……/P>检查你的条件,你应该考虑TrcActug值。
 Where datecolumn >= case ...... end -- start point
 And datecolumn < case ..... end -- end point
将tor case表达式分为两部分,并将数据与这些计算结果进行比较

CASE WHEN case_a THEN filter_a
     WHEN case_b THEN filter_b
                 ELSE exclude_the_row END
可以重写为:

WHERE ( case_a AND filter_a )
OR    ( NOT case_a AND case_b AND filter_b )
由于case_a和case_b到_charsysdate,'D'='1'和到_charsysdate,'D'>'1'的条件是相互排斥的,因此您可以忽略NOT case_a部分,逻辑是:

WHERE (    TO_CHAR(SYSDATE, 'D') = '1'
       AND run_date BETWEEN TRUNC(SYSDATE-3) AND TRUNC(SYSDATE-2) )
OR    (    TO_CHAR(SYSDATE, 'D') > '1' AND TO_CHAR(SYSDATE, 'D') <= '5'
       AND run_date BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE) )

为了获得最佳性能,您希望在日期列上有一个条件,特别是如果有一个索引,优化器可以使用该索引与运行时可以静态计算的值进行比较。我会用这样的方式:

where datecolumn
  between trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 3 else 1 end
      and trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 2 else 0 end

在确定一周中的哪一天时,还要注意MT0对nls_territory的评论。

您需要根据哪些时间精度筛选表列?第四列的名称是什么?我喜欢它的简单性,但有一个小问题是,第二个例子是to_charsysdate,'D'>'1',to_charsysdate,'D'='1',然后3个例子是to_charsysdate,'D'>'1',to_charsysdate,'D'
where datecolumn
  between trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 3 else 1 end
      and trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 2 else 0 end