我想创建一个查询,当它在星期一运行时,它会从星期五检索数据。当它是另一个工作日时,它应该检索前一天的数据。 目前我创建了这个查询,除了星期一之外它完全有效:
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
我曾尝试使用案例功能和在网络上找到的各种提示做一些事情,但我没有设法让它发挥作用。 谁能帮我。
答案 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