【问题标题】:Oracle Query to generate dates and calculated charge based on day range and invoice tablesOracle Query 根据日期范围和发票表生成日期和计算费用
【发布时间】:2015-02-10 06:04:03
【问题描述】:

谁能帮助我为低于预期的结果构建一个 oracle 查询 我有 2 个表,分别命名为 detention_charge_slotdetention_invoice 示例如下

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

【问题讨论】:

  • 您熟悉 PL/SQL 吗?您将需要它来生成这样的表。

标签: oracle


【解决方案1】:

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);

【讨论】:

  • 谢谢,您的查询结果将是一个单一的值,但我希望日期与插槽明智的费用
  • 不,你说你想要一些代码“在查询中接受两个参数,如 &param1= '10-JAN-2015' 和 &param2='25-JAN-2015'.”。如果您希望它针对存储在另一个表中的多个日期范围运行,您只需加入该表并用 Start_date 和 End_date 替换这两个参数。
  • 我想要两个日期参数之间的条件(基于表中的预定义期间)日期范围,如上例所示。这里可以使用connect by子句,但实际上不知道。
  • 我不明白你在说什么。如需进一步帮助,请使用完整的测试用例更新您的问题 - 即 CREATE TABLE 命令、示例数据和预期输出。
【解决方案2】:
select invoice_dt + from_days - 1 start_date, 
    invoice_dt + to_days -1 end_date, 
    to_days-from_days + 1 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  2017-10-04  985         25,00

最后一行不同,因为您在detention_charge_slot.to_days 中输入了 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2018-06-13
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多