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