Pl Sql sysdate遍历整个星期

时间:2015-11-06 10:15:04

标签: sql oracle

我正在寻找一个我必须解决的Pl Sql问题的建议/最佳实践,我必须运行每周一次的proc,这将在每一天迭代整个星期,现在我只是想知道如何确定我到/从日期开始 一周中的每一天,让我们举一个2015年8月11日结束的一周的例子。 我必须得到数据11 / 02,11 / 03,11 / 04 /,11/05 /,11 / 06,11 / 07,11 / 08,所以我和我的日期应该以这样的方式给出proc可以每天迭代整周。

我想我必须提供更多的清晰度,我的问题是我必须确保我的from和to_date准确捕获从上午12点到晚上23:59的数据,即整天,所以标准是from_date =午夜12点,to_date =同一天的23:59 pm,当我每周星期一晚上运行我的过程时,整天应该每天捕获整周的数据。

感谢任何输入。

2 个答案:

答案 0 :(得分:0)

您可以使用行生成器方法获取当前ISO周的所有日期(启动星期一并结束周日

SQL> SELECT TRUNC(sysdate,'IW') + level - 1 the_date
  2  FROM dual
  3    CONNECT BY LEVEL <= 7
  4  /

THE_DATE
----------
02/11/2015
03/11/2015
04/11/2015
05/11/2015
06/11/2015
07/11/2015
08/11/2015

7 rows selected.

更新 OP实际上希望获得当天的第一个和最后一秒作为 FROM_DATE TO_DATE

您可以在当天添加一天,然后使用 + 1 - (INTERVAL&#39; 1&#39; SECOND)减去一秒,以获得当天的最后一秒。

例如,

SQL> SELECT TRUNC(SYSDATE,'IW') + LEVEL - 1 FROM_DATE,
  2         TRUNC(SYSDATE,'IW') + LEVEL - 1 + 1 - (INTERVAL '1' SECOND) TO_DATE
  3  FROM dual
  4    CONNECT BY LEVEL <= 7
  5  /

FROM_DATE           TO_DATE
------------------- -------------------
11/02/2015 00:00:00 11/02/2015 23:59:59
11/03/2015 00:00:00 11/03/2015 23:59:59
11/04/2015 00:00:00 11/04/2015 23:59:59
11/05/2015 00:00:00 11/05/2015 23:59:59
11/06/2015 00:00:00 11/06/2015 23:59:59
11/07/2015 00:00:00 11/07/2015 23:59:59
11/08/2015 00:00:00 11/08/2015 23:59:59

7 rows selected.

答案 1 :(得分:0)

这是一个简单的PL / SQL版本。 TRUNC获得期间的开始(在这种情况下,根据ISO的一周)。然后,您只需添加数字0到6即可获得一周中的所有日期:

declare
  start_of_week date;
begin
  start_of_week := trunc(sysdate, 'IW');
  for i in 0..6 loop
    dbms_output.put_line('Date: ' || (start_of_week + i));
  end loop;
end;
/