Fisc_prd代表月份 fisc_yr代表年份 我需要结果,如果当前月份是01(即1月),那么我需要前一年的所有期间,即1到12,如果当前月份不等于01,那么我需要所有当前的期间年份少于当月(例如,如果当前月份是3,那么我需要1到2作为fisc_prd)
我只能获得前一年的所有fisc_prd,但是fisc_prd不能比当前年度的fisc_prd少。在下面的查询中,CALENDAR表包含所有月份和年份值。通过此查询,我可以获得当前月份为01的前一年的所有fisc_prd。
SELECT FISC_PRD,FISC_YR FROM CALENDAR WHERE FISC_YR=(SELECT DECODE(TO_NUMBER(TO_CHAR(SYSDATE,'MM')),01,(TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))-1) ,TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))) FROM DUAL)
请分享您的想法
答案 0 :(得分:2)
如果您基于当前日期,那么您可以使用连接分层查询来获取期间和年份:
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
要检查其他日期的行为方式,您可以使用使用特定日期但逻辑相同的修改版本;我在这里使用绑定变量:
变量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是因为您不希望当前月份包含在结果中。
答案 1 :(得分:2)
这应该有效:
with sample_data as (select to_number(to_char(add_months(sysdate, 6 - level), 'mm')) fisc_prd,
to_number(to_char(add_months(sysdate, 6 - level), 'yyyy')) fisc_yr
from dual
connect by level <= 24)
select fisc_prd,
fisc_yr
from sample_data
where case when to_char(sysdate, 'mm') = '01' then to_number(to_char(sysdate, 'yyyy')) -1
else to_number(to_char(sysdate, 'yyyy')) end = fisc_yr
and case when to_char(sysdate, 'mm') = '01' then 13
else to_number(to_char(sysdate, 'mm')) end > fisc_prd;
答案 2 :(得分:-1)
如果您的colum“FISC_YR”是datetime数据类型,那么以下查询将适合您
SELECT FISC_PRD,FISC_YR
FROM CALENDAR
WHERE
(month(getdate())!=1 AND month(FISC_YR) in(month(getdate())- 1,month(getdate())-2) AND year(getdate())=year(FISC_YR))
OR
(month(getdate())=1 AND year(getdate())-1=year(FISC_YR))