2015-02-10 55 views
0

任何人都可以帮助我建立一个Oracle查询为 我有2个表,命名为detention_charge_slotdetention_invoice举例如下低于预期的结果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 
+0

你熟悉PL/SQL吗?你将需要它来生成这样的表格。 – 2015-02-10 06:22:01

回答

0

Predica查询在SQL查询TES可以基于表达式,例如:

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

谢谢您,您的查询结果将是一个单一的值,但我期待与明智的收费日期 – 2015-02-10 07:12:17

+0

不,你说你想要一些代码,将需要两个参数“像&param1 = '10 -JAN-2015'和&param2 = '25 -JAN-2015' 。“。如果您希望它运行存储在另一个表中的多个日期范围,则只需加入该表并将Start_date和End_date替换为这两个参数即可。 – 2015-02-10 07:28:38

+0

我希望有条件的(基于表中预定义的时间段)日期范围如上例中两个日期参数之间。这里可以使用连接子句,但实际上并不知道。 – 2015-02-10 07:37:29

0
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