将日期范围转换为多个期间

时间:2012-11-12 04:13:58

标签: sql oracle informatica-powercenter

我有如下表格

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 oracle作为数据库,我愿意用informatica做这个但似乎很难在那里找到解决方案,不能创建一个程序所以需要sql查询。如果任何人都可以提供信息8.6那么那将是非常好的。

编辑: -

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

create table yr_range
(years date);

插入陈述: -

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)?我想在最终确定之前探索所有选项。

1 个答案:

答案 0 :(得分: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