Oracle SQL动态日期插入

Oracle SQL动态日期插入,sql,oracle,date,dynamic,Sql,Oracle,Date,Dynamic,我有一个外汇汇率表,其中有一些丢失的数据。我有一个from_ccy_code、to_ccy_code、fx_date和fx_rate列。我想做的是,如果该日期不存在记录,那么插入一个设置为1的记录外汇汇率。 在这种情况下,除插入外汇汇率的日期外,所有其他值都是静态的。如果值不存在,我可以编写SQL来插入特定日期,但我需要在插入中动态插入日期。有人能帮我做这件事吗 以下是我到目前为止所做的。我知道这可能不是正确的语法,但一旦正确,这应该适用于设定的日期。我不知道如何在这样的场景中使日期变得动态 i

我有一个外汇汇率表,其中有一些丢失的数据。我有一个from_ccy_code、to_ccy_code、fx_date和fx_rate列。我想做的是,如果该日期不存在记录,那么插入一个设置为1的记录外汇汇率。 在这种情况下,除插入外汇汇率的日期外,所有其他值都是静态的。如果值不存在,我可以编写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'));

任何帮助都将不胜感激。

您可以使用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 
您可以在此基础上创建一个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);

.

您的意思是要在一条语句中插入一条记录,记录一系列日期中所有缺失的日期吗?或者只是想将固定日期作为参数?我想插入一条记录,记录预定义日期范围内所有缺失的日期。如果可能的话,我希望在一个单独的声明中理想地做到这一点。
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);