2012-11-12 19 views
1

我有表像下面轉換日期範圍內多個時期

ID StartDate EndDate 
1 15-MAR-2009 8-DEC-2011 
2 14-JAN-2010 18-FEB-2013 

我需要的輸出是這樣的 -

ID StartDate EndDate 
1 15-MAR-2009 31-DEC-2009 
1 1-JAN-2010 31-DEC-2010 
1 1-JAN-2011 8-Dec-2011 
2 14-JAN-2010 31-DEC-2010 
2 1-JAN-2011 31-DEC-2011 
2 1-JAN-2012 31-DEC-2012 
2 1-JAN-2013 18-FEB-2013 

我9i的甲骨文數據庫,我會perfer與Informatica這樣做但似乎很難找到解決方案,不能創建一個程序,所以需要SQL查詢。如果任何人都可以在informatica 8.6中提供,那就更棒了。

編輯: -

Create table test_range 
(Sr_No number, 
start_date date, 
end_date date) 

create table yr_range 
(years date); 

Insert語句: -

insert into test_range values (1,'15-MAR-2009','8-DEC-2011'); 
insert into test_range values (2,'14-JAN-2010','18-FEB-2013'); 

insert into yr_range values ('31-Dec-2005'); 
insert into yr_range values ('31-Dec-2006'); 
insert into yr_range values ('31-Dec-2007'); 
insert into yr_range values ('31-Dec-2008'); 
insert into yr_range values ('31-Dec-2009'); 
insert into yr_range values ('31-Dec-2010'); 
insert into yr_range values ('31-Dec-2011'); 
insert into yr_range values ('31-Dec-2012'); 
insert into yr_range values ('31-Dec-2013'); 

正如在回答一個建議,我已創建的另一個表,從而獲得所需的輸出,使用一個表有可能只(即test_range)?我希望在最終確定這個選項之前,讓所有選項都被攻擊者利用。

+0

我沒有得到現有數據與您建議的輸出之間的關係。 – Raptor

+0

我認爲,OP每年打破日期範圍,即一行在多行中斷,每行只包含一年期限。 –

+0

由於yogendra提到12月31日是年終日期,所以我需要打破一行到多行的基礎上和enddate,以較小的那一年 –

回答

2

如果您有類似年份維度的內容,每行代表一年,那麼您將根據年份是否在該範圍內加入。這會給你你需要的行數,然後爲每一行有條件地輸出開始/結束範圍。這也應該處理你的範圍小於一年的情況,因此不會分裂。

y.Year被認爲是一個整數。

看到這裏的工作例如:http://sqlfiddle.com/#!4/d4589/13/11

Create table test_range 
(Sr_No number, 
StartDate date, 
EndDate date); 

create table yr_range 
(years number); 

insert into test_range values (1,'15-MAR-2009','8-DEC-2011'); 
insert into test_range values (2,'14-JAN-2010','18-FEB-2013'); 

insert into yr_range values ('2005'); 
insert into yr_range values ('2006'); 
insert into yr_range values ('2007'); 
insert into yr_range values ('2008'); 
insert into yr_range values ('2009'); 
insert into yr_range values ('2010'); 
insert into yr_range values ('2011'); 
insert into yr_range values ('2012'); 
insert into yr_range values ('2013'); 


select 
r.Sr_No, 
CASE 
    When to_char(r.StartDate, 'yyyy') = y.years Then r.StartDate 
    Else to_date(y.years || '/01/01', 'yyyy/mm/dd') 
END as StartDate, 
CASE 
    When to_char(r.EndDate , 'yyyy') = y.years Then r.EndDate 
    Else to_date(y.years || '/12/31', 'yyyy/mm/dd') 
END as EndDate 
from test_range r, yr_range y 
where 
     to_char(r.StartDate, 'yyyy') <= y.years 
    AND to_char(r.EndDate, 'yyyy') >= y.years; 

你也可以產生一些使用這些技術的多年序列: ORACLE SQL:Get all integers between two numbers

+0

我編輯了問題,我能夠得到所需的幾個變化 - heres查詢 - 選擇 sr_no, CASE 當(起始 y.years Then to_date(to_char(y.Years,'yyyy')|| '/ 12/31','yyyy/mm/dd') Else End_Date END from EndDate from test_range r,yr_range y 其中 r.start_date <= y.Years and to_number(to_char(r.End_Date,'yyyy'))> = to_number(to_char(y.years,'yyyy')) –

+0

我在想y.Year會是一個整數,而不是日期。你遇到了'Start_Date 是錯誤的,所以你的開始日期是01/01/2009,這比真實的要早一年開始日期。 – AaronLS

+0

嘗試返回更類似於to_char(r.StartDate,'yyyy')= y.Year的CASE When部分。 – AaronLS