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

时间:2016-05-13 08:16:07

标签: sql oracle oracle11g where

请原谅我对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

如果有人需要更多信息,请随时提出任何帮助,我会很感激,我会告诉你我所知道的事情(虽然我对这种环境的经验非常有限)

谢谢,

4 个答案:

答案 0 :(得分:0)

您可以使用一些布尔逻辑重写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,这不是一个坏主意,但是使用它作为一个语句,而不给出返回值,而不是将它作为一个表达式(计算一个值)来比较它的值其他一些数据。 但是我更喜欢让我的条件尽可能清楚,所以我通常会尝试用布尔逻辑来编写它们;这当然是我自己的观点,不考虑绩效。

请考虑我只是修改了你的条件,假设它们是正确的;例如,如果您需要根据天数而不是小时,分钟等来检查您的条件,您应该考虑truncatig值...

答案 1 :(得分:0)

 Where datecolumn >= case ...... end -- start point
 And datecolumn < case ..... end -- end point

将案例表达式分为两部分,并将数据与这些计算进行比较。

答案 2 :(得分:0)

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_acase_bto_char(sysdate, 'D') = '1'to_char(sysdate, '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) )

您需要注意NLS_TERRITORY会话参数会影响星期一是否是一周的第一天(在某些地区不是),如果您受此影响,那么您可以获得使用以下内容的星期几的数值(独立于领土)

1 + TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' )

答案 3 :(得分:0)

为了获得最佳性能,您希望在日期列上具有单个条件(特别是如果优化器可以使用的索引),则可以在运行时静态评估值。我会用这样的东西:

var n = 11.13;
document.getElementById('num').value = +n; // 11

请注意MT0在确定星期几时对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 的评论。