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 oracle 作为数据库,我更喜欢用 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 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)?我想在最终确定之前探索所有选项。

4

1 回答 1

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

于 2012-11-12T04:41:36.613 回答