根据日期范围和发票表生成日期和计算费用的Oracle查询

根据日期范围和发票表生成日期和计算费用的Oracle查询,oracle,Oracle,有谁能帮助我为低于预期的结果构建一个oracle查询 我有两个表,分别命名为扣留费和扣留发票示例,如下所示 create table detention_charge_slot (slot_no number(5), from_days number(10), to_days number(10), charge_amount number(10,2)); insert into detention_charge_slot

有谁能帮助我为低于预期的结果构建一个oracle查询 我有两个表,分别命名为扣留费和扣留发票示例,如下所示

create table detention_charge_slot
        (slot_no number(5),
        from_days number(10),
        to_days number(10),
        charge_amount number(10,2));

insert into detention_charge_slot
        values (1,1,4,0);

        insert into detention_charge_slot
        values (2,5,9,10);

        insert into detention_charge_slot
        values (3,10,14,20);

        insert into detention_charge_slot
        values (4,15,999,25);

create table detention_invoice
        (invoice_no number(10),
        invoice_dt date,
        delivery_dt date);
insert into detention_invoice
        values(1,'10-JAN-2015','25-JAN-2015');
现在我想为invoice_no=1编写一个查询,它将给出以下结果

Start_date | End_date |   Days| Charge_Amount
10-JAN-2015  13-JAN-2015    4      0
14-JAN-2015  18-JAN-2015    5     10
19-JAN-2015  23-JAN-2015    5     20
24-JAN-2015  25-JAN-2015    2     25

SQL查询中的谓词可以基于表达式,例如:

SELECT Charge
FROM   date_range_charge
WHERE  From_days <= (TO_DATE(:param2,'DD-MON-YYYY') 
                     - TO_DATE(:param1,'DD-MON-YYYY') + 1)
AND    To_days   >= (TO_DATE(:param2,'DD-MON-YYYY')
                     - TO_DATE(:param1,'DD-MON-YYYY') + 1);
最后一行是不同的,因为你把999关在拘留所里。如果需要2,请按如下方式修改查询:

select invoice_dt + from_days - 1 start_date, 
    least(invoice_dt + to_days - 1, delivery_dt) end_date, 
    least(invoice_dt + to_days - 1, delivery_dt) - (invoice_dt + from_days - 2) days, 
    charge_amount
  from detention_charge_slot dcs
    join detention_invoice di on (di.invoice_no = 1)
  order by slot_no

result: 
START_DATE  END_DATE   DAYS CHARGE_AMOUNT
2015-01-10  2015-01-13    4          0,00
2015-01-14  2015-01-18    5         10,00
2015-01-19  2015-01-23    5         20,00
2015-01-24  2015-01-25    2         25,00

您熟悉PL/SQL吗?您将需要它来生成这样的表。谢谢,您的查询结果将是一个单一值,但我希望使用插槽方式计费的日期不,您说您需要一些代码,在查询中包含两个参数,如¶m1='10-JAN-2015'和¶m2='25-JAN-2015'。。如果希望对另一个表中存储的多个日期范围运行此操作,只需连接到该表,并用两个参数替换开始日期和结束日期。我希望条件基于表日期范围中预定义的期间,如上面两个日期参数之间的示例所示。这里可以使用connect by子句,但实际上不知道。我不明白你在说什么。如需进一步帮助,请使用完整的测试用例更新您的问题-即创建表命令、示例数据和预期输出。
select invoice_dt + from_days - 1 start_date, 
    least(invoice_dt + to_days - 1, delivery_dt) end_date, 
    least(invoice_dt + to_days - 1, delivery_dt) - (invoice_dt + from_days - 2) days, 
    charge_amount
  from detention_charge_slot dcs
    join detention_invoice di on (di.invoice_no = 1)
  order by slot_no

result: 
START_DATE  END_DATE   DAYS CHARGE_AMOUNT
2015-01-10  2015-01-13    4          0,00
2015-01-14  2015-01-18    5         10,00
2015-01-19  2015-01-23    5         20,00
2015-01-24  2015-01-25    2         25,00