我需要获取上周日和周六之间的所有记录,包括查询运行的日期。今天,即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?)
答案 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日的逻辑将是:
...和
..导致以下查询:
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)