2015-02-23 232 views
-1

Fisc_prd代表月份 fisc_yr代表年份 我需要的結果是,如果當前月份是01(即1月份),那麼我需要上一年的所有期間,即1到12,如果當前月份不等於01,那麼我需要當年的所有期間小於當前月份(例如,如果當前月份是3,那麼我需要1到2作爲fisc_prd)獲取特定年份的月份值

我只能得到所有前一年的fisc_prd,但不能在當年獲得fisc_prd小於當前月份。在下面的查詢,萬年曆錶包含了所有的月和年values.By USIG此查詢我可以得到所有的fisc_prd爲上一年當月爲01

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

使用'CASE'表達'WHERE'條款。 – 2015-02-23 10:32:27

+0

請提供一些示例數據和表格DDL。我們不知道你的表格細節,數據類型是什麼。這些問題缺乏基本信息。 – 2015-02-23 10:46:04

回答

-1

如果你的科拉姆「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)) 
+0

否FISC_YR和FISC_PRD是小數位字段..當我運行此查詢IT TELLS時,月份是無效標識符。 – 2015-02-23 10:19:49

+0

getdate()不是Oracle函數。 – 2015-02-23 10:24:47

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 

要檢查它的行爲你可以使用一個使用特定日期,但同樣的邏輯的修改版本的其他日期;我在這裏使用綁定變量:

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是因爲您不希望將當前月份包含在結果中。

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; 
相關問題