获取特定年份的月份值

时间:2015-02-23 10:02:20

标签: sql oracle

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)

请分享您的想法

3 个答案:

答案 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))