如何在oracle中为日期范围时段获取不同的费率

如何在oracle中为日期范围时段获取不同的费率,oracle,Oracle,我有一个ipnut,如下所示 code startdate enddate rate f2 2016-09-01 00:00:00.000 2016-09-18 00:00:00.000 12 f2 2016-09-19 00:00:00.000 2016-09-30 00:00:00.000 8 g1 2016-09-01 00:00:00.000 2016-09-20 00:00:00.000

我有一个ipnut,如下所示

code       startdate              enddate                  rate

f2  2016-09-01 00:00:00.000 2016-09-18 00:00:00.000     12
f2  2016-09-19 00:00:00.000 2016-09-30 00:00:00.000     8

g1  2016-09-01 00:00:00.000 2016-09-20 00:00:00.000     7
g1  2016-09-21 00:00:00.000 2016-09-30 00:00:00.000     5

jn  2016-09-01 00:00:00.000 2016-09-15 00:00:00.000     15
jn  2016-09-16 00:00:00.000 2016-09-30 00:00:00.000     10
我希望输出对应于每个startdate和enddate期间,使用oracle的代码如下

code       startdate              enddate                  rate

f2  2016-09-01 00:00:00.000 2016-09-15 00:00:00.000     12
f2  2016-09-16 00:00:00.000 2016-09-18 00:00:00.000     12
f2  2016-09-19 00:00:00.000 2016-09-20 00:00:00.000     8
f2  2016-09-21 00:00:00.000 2016-09-30 00:00:00.000     8

g1  2016-09-01 00:00:00.000 2016-09-15 00:00:00.000     7
g1  2016-09-16 00:00:00.000 2016-09-18 00:00:00.000     7
g1  2016-09-19 00:00:00.000 2016-09-20 00:00:00.000     7
g1  2016-09-21 00:00:00.000 2016-09-30 00:00:00.000     5

jn  2016-09-01 00:00:00.000 2016-09-15 00:00:00.000     15
jn  2016-09-16 00:00:00.000 2016-09-18 00:00:00.000     10
jn  2016-09-19 00:00:00.000 2016-09-20 00:00:00.000     10
jn  2016-09-21 00:00:00.000 2016-09-30 00:00:00.000     10

如果我理解正确,您希望从给定表中查找所有startdate和enddate期间,即:

+-----------+-----------+
| STARTDATE | ENDDATE   |
+-----------+-----------+
| 01-SEP-16 | 15-SEP-16 |
+-----------+-----------+
| 16-SEP-16 | 18-SEP-16 |
+-----------+-----------+
| 19-SEP-16 | 20-SEP-16 |
+-----------+-----------+
| 21-SEP-16 | 30-SEP-16 |
+-----------+-----------+
然后,当给定表中的周期在上述周期内时,查找上述每个周期的速率

试试这个:

select
  t.code,
  t2.startdate,
  t2.enddate,
  t.rate
from t inner join (
  select startdate, min(enddate) enddate
  from (
    select distinct startdate
    from t
  ) t1 inner join (
    select distinct enddate
    from t
  ) t2 on t1.startdate <= t2.enddate
  group by startdate
) t2 on t.startdate <= t2.startdate
and t.enddate >= t2.enddate
order by 1, 2, 3, 4;

? 从您提供的输入到您显示的输出有哪些规则?您认为需求是什么?因为它在原始帖子中不可见,所以它可能有助于准确地说明您在这里解决了什么问题。