Oracle SQL动态日期插入

时间:2014-10-28 11:20:21

标签: sql oracle date dynamic

我有一张外汇汇率表,其中有一些数据丢失。我有一个from_ccy_code,to_ccy_code,fx_date和fx_rate列。我想要做的是from_ccy_code = USD和to_ccy_code = EUR,如果该日期没有记录,则插入一条记录(fx_rate设置为1)。 在这种情况下,除了要插入fx_rate的日期之外,所有其他值都是静态的。如果值不存在,我可以编写SQL来插入特定日期,但我需要在插入中将日期设置为动态。请问有人可以帮忙解决这个问题吗?

以下是我到目前为止的情况。我知道这可能不是正确的语法,但一旦正确,这应该适用于设定日期。我不知道如何在这样的场景中使日期变得动态。

insert into fx_rates (from_ccy_code, to_ccy_code, fx_date, fx_rate) 
select 'USD', 'EUR'
from dual
where not exists(select * 
                 from fx_rates
                 where (from_ccy_code ='USD' and to_ccy_code ='EUR' and fx_date = '01-OCT-14'));

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用connect by子句生成范围的所有日期;例如,查看从10月1日到昨天的所有日子:

select date '2014-10-01' + level - 1
from dual
connect by level <= trunc(sysdate) - date '2014-10-01';

DATE'2014-10-01'+LEVEL-1
------------------------
01-OCT-14                
02-OCT-14                
...
26-OCT-14                
27-OCT-14                

 27 rows selected 

您当然可以使用自己的日期范围,我只是使用固定值来演示 - 您可能真的想要开始日期和结束日期的绑定值,或者从当月开始 - 使用trunc(sysdate, 'MM')代替固定的开始日期。取决于我猜想如何以及何时运行。

您可以将固定值添加到同一查询中,将其用作公用表表达式(或内联视图),并使用类似的not exists构造来检查您需要插入的值: / p>

with t (from_ccy_code, to_ccy_code, fx_date, fx_rate) as (
  select 'USD', 'EUR', date '2014-10-01' + level - 1, 1
  from dual
  connect by level <= trunc(sysdate) - date '2014-10-01'
)
select * from t
where not exists(
  select * 
  from fx_rates fr
  where fr.from_ccy_code = t.from_ccy_code
  and fr.to_ccy_code = t.to_ccy_code
  and fr.fx_date = t.fx_date
);

你可以在insert上加上merge,但要使其适应merge into fx_rates fr using ( select 'USD' as from_ccy_code, 'EUR' as to_ccy_code, date '2014-10-01' + level - 1 as fx_date, 1 as fx_rate from dual connect by level <= trunc(sysdate) - date '2014-10-01' ) t on ( t.from_ccy_code = fr.from_ccy_code and t.to_ccy_code = fr.to_ccy_code and t.fx_date = fr.fx_date ) when not matched then insert (from_ccy_code, to_ccy_code, fx_date, fx_rate) values (t.from_ccy_code, t.to_ccy_code, t.fx_date, t.fx_rate); 声明可能更清晰:

{{1}}

SQL Fiddle demo