2016-08-30 47 views
0

我有兩個輸入日期作爲參數,我的查詢應返回兩個日期之間的上一季度結束日期。 我們一年有四個季度。用於查找日期範圍的上一季度結束日期的SQL查詢

Q1 -Jan to March 
Q2-Apr to June 
Q3-Jul to Sep 
Q4-Oct to Dec 

輸入日期Q1-2015,從查詢返回的Q2-2016

日期數

Dec 31st 2014 
March 31st 2015 
June 30 2015 
Sep 30 2015 
Dec 31st 2015 
March 31st 2016 

輸入日期 Q1-2016 Q2-2016

Number of Dates to be returned from query 
Dec 31st 2015 
March 31 2016 

我需要它在查詢中返回。 感謝您的幫助。

+0

請包括您的表格中的一些示例數據以符合您的預期輸出。 –

回答

0

下面的解決方案將輸入作爲綁定變量。它只在輸入完全符合該格式時才起作用(七個字符的字符串'Qx-yyyy',其中x從1到4,yyyy是有效年份),並且只有當「to-quarter」等於或晚於「from -25美分硬幣」;我的解決方案沒有做任何驗證以確保是這種情況,並且違反這些規則的行爲是未定義的(這意味着我沒有花時間測試任何「違反規則」的情況)。

with 
    prep (from_qtr, from_yr, to_qtr, to_yr) as (
     select to_number(substr(:from_year, 2, 1)), 
       to_number(substr(:from_year, 4 )), 
       to_number(substr(:to_year , 2, 1)), 
       to_number(substr(:to_year , 4 )) 
     from dual 
    ) 
select add_months(to_date(to_char(from_yr) || '/' || to_char(3 * from_qtr - 2) 
           || '/01', 'yyyy/mm/dd') - 1, 
        3 * (level - 1) 
       ) as qtr_end_date 
from prep 
connect by level <= 1 + 4 * (to_yr - from_yr) + (to_qtr - from_qtr) 
order by qtr_end_date 
; 

注:如果您無法連接使用按級別,你可以沒有它,但你需要一個機制來生成數字1到足夠高的限制。您可以硬編碼num表(類似於下面的表),也可以使用某種機制從具有多行的表中讀取行號。這裏是一個可能的解決方案:

with 
    prep (from_qtr, from_yr, to_qtr, to_yr) as (
     select to_number(substr(:from_year, 2, 1)), 
       to_number(substr(:from_year, 4 )), 
       to_number(substr(:to_year , 2, 1)), 
       to_number(substr(:to_year , 4 )) 
     from dual 
    ), 
    num (rn) as (select rownum from all_tab_columns) 
select add_months(to_date(to_char(from_yr) || '/' || to_char(3 * from_qtr - 2) 
           || '/01', 'yyyy/mm/dd') - 1, 
        3 * (rn - 1) 
       ) as qtr_end_date 
from prep cross join num 
where rn <= 1 + 4 * (to_yr - from_yr) + (to_qtr - from_qtr) 
order by qtr_end_date 
; 

硬編碼的另一種方法是說num (rn) as select 1 from dual union all select 2 from dual union all select 3 from dual ...... ),你需要有足夠的數量,以覆蓋所有可能的情況。

+0

嗨,這正是我所需要的,我正在尋找sybase.do,我們已通過Sybase連接。 – user3200735

+0

我只會說Oracle。如果您使用Sybase,爲什麼您的帖子標記爲「oracle」? – mathguy

+0

嗨,沒有找到標籤的sybase,所以認爲我可以在sybase中編寫,如果我在oracle中,我們可以修改這個沒有使用連接,但這個查詢的輸出是正確的,我檢查了oracle.Same邏輯沒有連接我們可以達到 – user3200735

0

這就是需要的東西,我正在查看sybase.do,我們已通過Sybase連接。