如何在Oracle查询中将一种货币转换为另一种货币

时间:2020-01-14 09:20:26

标签: oracle

我要选择一个特定日期的美元孝度支出。但我需要将该日期转换为韩元。货币的价值随时随美元而变化。货币历史记录在 V_CURRENCY 表中。我需要将美元乘以该数量并显示为韩元。我的查询在下面,并给出一个错误。错误为 [22008] [1861] ORA-01861 。行不匹配。

with cte as (
    select t.filial_code,
           t.modified_by                      as emp_code,
           sum(t.sum_oper)                    as summa,
           to_char(t.oper_date, 'YYYY-MM-DD') as operation_date
    from OPERS t,
         DEP_OPERS d
    WHERE 
      And t.modified_by = 213
      And t.filial_code = '00116'
      And d.currency_code = 840
      And t.oper_date >= to_date('07.01.2020', 'DD.MM.YYYY')
      And t.oper_date < to_date('11.01.2020', 'DD.MM.YYYY')
    group by to_char(t.oper_date, 'YYYY-MM-DD'), t.filial_code, t.modified_by
) select cte.filial_code,cte.emp_code,cte.summa * (select equival from V_CURRENCY
    where date_activ = (select max(date_activ)
                            from V_CURRENCY
                         where date_activ <= cte.operation_date) and code = 840) as summa,cte.operation_date from cte;

我从cte获得以下结果:

FILIAL_CODE | EMP_CODE | SUMMA | OPERATION_DATE
-----------------------------------------------
00116       | 213      | 40000 | 2020-01-14
00116       | 213      | 6000  | 2020-01-10
00116       | 213      | 2800  | 2020-01-06

我的 V_CURRENCY 表如下:

CODE   | DATE_ACTIV             | EQUIVAL|
--------------------------------
840    | 2020-01-13 00:00:00    | 576.97
840    | 2020-01-07 00:00:00    | 2008.54
840    | 2020-01-06 00:00:00    | 1941.91
840    | 2019-12-22 00:00:00    | 301.62
190    | 2020-01-13 00:00:00    | 1200.97
270    | 2020-01-13 00:00:00    | 2300.21
800    | 2019-12-22 00:00:00    | 100.62

我需要将日期 2020-01-13 00:00:00 中表 V_CURRENCY 的等值乘以我的CTE结果SUMMA, OPERATION_DATE 2020-01-14 ,表示4000 * 576.97,导致 OPERATION_DATE 最接近货币更改日期。但是,当 DATE_ACTIV 存在于日期2020-01-06时,则为2800 * 1941.91。我只需要代码为840的curreny值即可。

我的最后一个结果应该是:

FILIAL_CODE | EMP_CODE | SUMMA           | OPERATION_DATE
-----------------------------------------------
00116       | 213      | 40000 * 576.97  | 2020-01-14
00116       | 213      | 6000 *  2008.54 | 2020-01-10
00116       | 213      | 2800  * 1941.91 | 2020-01-06

任何回应表示赞赏。预先感谢。

1 个答案:

答案 0 :(得分:2)

使用return batchPromises(100, asset_equipments, aeq => { const icon_id = my_icons.find(icon => icon.name === aeq.icon_name).id; return my_equipments.update({ icon_id }, { where: { code: aeq.eq_id } }); }); 分析函数查找货币兑换有效期的截止日期,然后在货币有效的开始日期和结束日期之间的范围内联接表:

LEAD

输出:

FILIAL_CODE | EMP_CODE |    SUMMA | OPERATION_DATE
:---------- | -------: | -------: | :-------------
00116       |      213 | 23078800 | 14-JAN-20     
00116       |      213 | 12051240 | 10-JAN-20     
00116       |      213 |  5437348 | 06-JAN-20     

db <>提琴here

顺便说一句,您的CTE不需要将日期转换为字符串,并且可以使用日期文字和现代ANSI连接(而不是传统的逗号连接):

SELECT y.filial_code,
       y.emp_code,
       y.summa * c.equival AS summa,
       y.operation_date
FROM   your_cte y
       INNER JOIN (
         SELECT c.*,
                LEAD( DATE_ACTIV, 1, SYSDATE )
                  OVER ( PARTITION BY code ORDER BY date_activ )
                  AS DATE_FINISHED
         FROM   v_currency c
         WHERE  currency_code = 840
       ) c
       ON (   y.operation_date >= c.date_activ
          AND y.operation_date <  c.date_finished )

您甚至不需要CTE:

with cte ( filial_code, emp_code, summa, operation_date ) as (
    SELECT t.filial_code,
           t.modified_by,
           sum(t.sum_oper),
           t.oper_date
    from   OPERS t
           CROSS JOIN
           DEP_OPERS d
    WHERE  t.modified_by   = 213
    AND    t.filial_code   = '00116'
    AND    d.currency_code = 840
    AND    t.oper_date     >= DATE '2020-01-07'
    AND    t.oper_date     <  DATE '2020-01-11'
    GROUP BY t.oper_date,
             t.filial_code,
             t.modified_by
)
...