如何在oracle中为日期范围期间获得不同的费率

时间:2017-02-08 16:04:24

标签: 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     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

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想找到给定表中的所有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;

Demo