【问题标题】:Oracle BI: Select all records from last weekOracle BI:选择上周的所有记录
【发布时间】:2011-04-19 17:28:32
【问题描述】:

无论运行查询的日期如何,我都需要获取日期在上周的星期日和星期六之间的所有记录。对于今天,即 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 吗?)

【问题讨论】:

    标签: oracle business-intelligence


    【解决方案1】:

    可以使用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 => 2011-04-19 00:00:00
    2. 减去 14 天 => 2011-04-05 00:00:00
    3. 寻找下一个星期日 => 2011-04-10 00:00:00

    ...和

    1. 截断 sysdate => 2011-04-19 00:00:00
    2. 减去 7 天 => 2011-04-12 00:00:00
    3. 寻找下一个星期日 => 2011-04-17 00:00:00

    ..导致以下查询:

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

    在 10:th 的第一秒或之后但在 17:th 的第一秒之前发生的所有已解决日期都将包括在内。请注意,&gt;=&lt; 不等同于 between

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

    【讨论】:

    • 我接受了这一点,尽管它在我的环境中不太适用,因为它引导我找到了正确的答案。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2021-01-01
      • 2011-08-20
      相关资源
      最近更新 更多