Oracle BI:选择上周的所有记录

时间:2011-04-19 17:28:33

标签: oracle business-intelligence

我需要获取上周日和周六之间的所有记录,包括查询运行的日期。今天,即2011年4月19日,即4月10日至4月16日。

当我手动输入日期并将过滤器转换为SQL时,我得到以下语法:

RESOLVED_DATE BETWEEN timestamp '2011-04-10 00:00:00' AND timestamp '2011-04-16 00:00:00'

我甚至不确定这是否正确,因为它似乎排除了16日的日期(不应该是时间是23:59:59?)

2 个答案:

答案 0 :(得分:2)

可以使用next_day和常规日期算术的组合来确定所需的日期。下面的代码应该非常接近,但它没有经过测试,并且可能在一些极端情况下失败,但至少你得到了一般的想法:)

where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
  and resolved_date <  next_day( trunc(sysdate) - interval '7'  day, 'SUN')

trunc(sysdate)截断日期; 2011-04-19 23:32:34成为2011-04-19 00:00:00,即删除时间组件。 next_day(sysdate, 'SUN')返回下一个星期天。如果sysdate恰好是星期日,则返回下一个星期日 重要:日期名称必须与会话语言相同。
interval这只是添加/减去日期不同时间单位的标准方法。

总而言之,2011年4月19日的逻辑将是:

  1. 截断sysdate =&gt; 2011-04-19 00:00:00
  2. 减去14天=&gt; 2011-04-05 00:00:00
  3. 找到下一个星期日=&gt; 2011-04-10 00:00:00
  4. ...和

    1. 截断sysdate =&gt; 2011-04-19 00:00:00
    2. 减去7天=&gt; 2011-04-12 00:00:00
    3. 找到下一个星期日=&gt; 2011-04-17 00:00:00
    4. ..导致以下查询:

       where resolved_date >= timestamp '2011-04-10 00:00:00'
         and resolved_date <  timestamp '2011-04-17 00:00:00'
      

      所有在10日的第一秒或之后但在17日的第一秒之前发生的resolve_dates将被包括在内。请注意,>=<不等同于between

      关于性能的说明:我将确保Oracle正确估计日期范围为7天,并使用正确的连接顺序/方法。如果您希望查询运行一段时间,您可以负担得起计算应用程序中的日期并将其作为日期文件提供,而不是像我上面那样动态计算它们。

答案 1 :(得分:0)