在Oracle SQL中,我想获取特定月份和年份的周数。例如:输入将以2019年为第8年,即其中的5周。
PROCEDURE SP_WEEKS(P_REFCURSOR OUT SYS_REFCURSOR,P_YEAR IN NUMBER:=-1,P_MONTH IN NUMBER:=-1) IS
BEGIN
OPEN P_REFCURSOR FOR
--here will return table
END SP_WEEKS
结果将是
ID NAME
-- ----
1 1
2 2
3 3
4 4
5 5
ID
和NAME
是星期数。我该怎么写?
预先感谢
答案 0 :(得分:1)
如果我很了解您的需求,您可以尝试:
CREATE OR REPLACE PROCEDURE SP_WEEKS(P_REFCURSOR OUT SYS_REFCURSOR,P_YEAR IN NUMBER:=-1,P_MONTH IN NUMBER:=-1) IS
BEGIN
OPEN P_REFCURSOR FOR
select level as ID, level as NAME
from dual
connect by add_months( date '0001-01-01', 12*P_YEAR + P_MONTH -1) + (level -1)*7
<= last_day(add_months( date '0001-01-01', 12*P_YEAR + P_MONTH -1));
END SP_WEEKS;
例如:
SQL> var result refcursor
SQL> begin
2 SP_WEEKS(:result, 2019, 8);
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> print :result
ID NAME
---------- ----------
1 1
2 2
3 3
4 4
5 5
这使用一种常用的技术来生成行,方法是从给定月份的第一天开始,每次迭代增加7天(LEVEL
);如果结果日期不在月份中,则CONNECT BY
条件将停止迭代。