星期一获取星期五的数据

时间:2017-01-26 15:17:21

标签: sql oracle

我想创建一个查询,当它在星期一运行时,它会从星期五检索数据。当它是另一个工作日时,它应该检索前一天的数据。 目前我创建了这个查询,除了星期一之外它完全有效:

Select sum(od.shippedqty) as SHIPPEDQTY
from orderdetail od, orders o
Where o.orderkey = od.orderkey
and to_char(o.actualshipdate, 'YYYYMMDD') = to_char(sysdate, 'YYYYMMDD') -1

我曾尝试使用案例功能和在网络上找到的各种提示做一些事情,但我没有设法让它发挥作用。 谁能帮我。

2 个答案:

答案 0 :(得分:4)

如果此查询适用于您,只需使用

更改最后的UNIQUE INDEX即可
-1

说到这一点 - 你如何从字符串中减去1? Oracle会将该字符串转换回一个数字,但这不会像日期那样正常工作。

相反:

   - case to_char(sysdate, 'Dy') when 'Mon' then 3 else 1 end

这比在左侧使用... and o.actualshipdate >= trunc(sysdate) - <expression from above> and o.actualshipdate < trunc(sysdate) - <expression from above> + 1 并与trunc进行比较更好,因为它允许在trunc(sysdate)上使用索引(假设有一个,因为那里如果你经常运行与此类似的查询,那应该是。

编辑:请参阅下面的MT0评论(谢谢你,MT0!)。当然,他是对的;如果查询可能在非英语语言环境中使用,那可能是个问题。即使我对actualshipdate子句进行了建议的修改,但在where表达式中仍然存在to_char()。那应该写成:

case

答案 1 :(得分:1)

您可以使用:

CASE TRUNC( your_date ) - TRUNC( your_date, 'IW' )
  WHEN 0 THEN your_date - INTERVAL '3' DAY -- Monday
  WHEN 6 THEN your_date - INTERVAL '2' DAY -- Sunday
         ELSE your_date - INTERVAL '1' DAY -- Tuesday - Saturday
END AS previous_workday