如果你在這個基礎上的當前日期,那麼你可以使用一個連接,通過分級查詢來獲得期間和年度:
select extract(month from add_months(sysdate, 1-level)) as fisc_prd,
extract(year from add_months(sysdate, 1-level)) as fisc_year
from dual
where level > 1
connect by level <= case when extract(month from sysdate) = 1 then 13
else extract(month from sysdate) end;
今天給出:
FISC_PRD FISC_YEAR
---------- ----------
1 2015
要檢查它的行爲你可以使用一個使用特定日期,但同樣的邏輯的修改版本的其他日期;我在這裏使用綁定變量:
variable dt varchar2; exec:dt:='2015-01-17';
select extract(month from add_months(to_date(:dt, 'YYYY-MM-DD'), 1-level)) as fisc_prd,
extract(year from add_months(to_date(:dt, 'YYYY-MM-DD'), 1-level)) as fisc_year
from dual
where level > 1
connect by level <= case
when extract(month from to_date(:dt, 'YYYY-MM-DD')) = 1 then 13
else extract(month from to_date(:dt, 'YYYY-MM-DD'))
end;
FISC_PRD FISC_YEAR
12 2014
11 2014
10 2014
9 2014
8 2014
7 2014
6 2014
5 2014
4 2014
3 2014
2 2014
1 2014
改變的dt
價值似乎給您所描述的結果;例如用
exec :dt := '2015-03-17';
你:
FISC_PRD FISC_YEAR
---------- ----------
2 2015
1 2015
但這僅僅是測試邏輯,你可以只使用SYSDATE,而不是綁定變量。
1-level
和如果當前月份是1月份,則使用13是因爲您不希望將當前月份包含在結果中。
使用'CASE'表達'WHERE'條款。 – 2015-02-23 10:32:27
請提供一些示例數據和表格DDL。我們不知道你的表格細節,數據類型是什麼。這些問題缺乏基本信息。 – 2015-02-23 10:46:04