Курс валюты

Имеется таблица изменений курса валют T_CURRENCY

CREATE TABLE T_CURRENCY
("CODE" VARCHAR2(32),
	"DATE_C" DATE,
  "VALUE" NUMBER
) TABLESPACE MIRAVILD_DATA;
 
COMMENT ON TABLE T_CURRENCY IS 'Валюта';
COMMENT ON COLUMN T_CURRENCY.CODE IS 'Код валюты';
COMMENT ON COLUMN T_CURRENCY.DATE_C IS 'Дата изменения курса';
COMMENT ON COLUMN T_CURRENCY.VALUE IS 'Значение курса';
/

Данные заносятся в эту таблицу каждый раз, когда изменяется значение курса какой либо валюты (каждый ли день он изменяется? Не каждый). Напишите SQL запрос, с помощью которого можно получить значение курса для заданной валюты на заданную дату.

Тестовые данные:

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('28-04-2016', 'dd-mm-yyyy'), 65.1618);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('29-04-2016', 'dd-mm-yyyy'), 65.1133);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('30-04-2016', 'dd-mm-yyyy'), 64.3334);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('05-05-2016', 'dd-mm-yyyy'), 66.1718);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('06-05-2016', 'dd-mm-yyyy'), 65.8918);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('07-05-2016', 'dd-mm-yyyy'), 66.1928);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('11-05-2016', 'dd-mm-yyyy'), 66.3277);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('USD', to_date('12-05-2016', 'dd-mm-yyyy'), 66.2428);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('28-04-2016', 'dd-mm-yyyy'), 73.8023);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('29-04-2016', 'dd-mm-yyyy'), 73.9166);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('30-04-2016', 'dd-mm-yyyy'), 73.3015);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('05-05-2016', 'dd-mm-yyyy'), 76.0512);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('06-05-2016', 'dd-mm-yyyy'), 75.5713);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('07-05-2016', 'dd-mm-yyyy'), 75.5789);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('11-05-2016', 'dd-mm-yyyy'), 75.5406);

INSERT INTO t_currency
  (code, date_c, VALUE)
VALUES
  ('EUR', to_date('12-05-2016', 'dd-mm-yyyy'), 75.4505);

COMMIT WORK;
/

Курс Доллар США на 04.05.2016:

SELECT c.value
  FROM t_currency c
 WHERE c.code = 'USD'
   AND c.date_c =
       (SELECT MAX(t.date_c)
          FROM t_currency t
         WHERE t.code = c.code
           AND t.date_c <= to_date('04.05.2016', 'dd.mm.yyyy'));
/

Вариант оформления подпрограммой:

CREATE OR REPLACE FUNCTION f_currency_rate(p_code   IN t_currency.code%TYPE, -- Код валюты
                                           p_date_c IN t_currency.date_c%TYPE) -- Дата изменения курса
 RETURN NUMBER IS
  v_value t_currency.value%TYPE;
BEGIN
  SELECT c.value
    INTO v_value
    FROM t_currency c
   WHERE c.code = p_code
     AND c.date_c = (SELECT MAX(t.date_c)
                       FROM t_currency t
                      WHERE t.code = c.code
                        AND t.date_c <= p_date_c);
  RETURN v_value;

END f_currency_rate;
/

P.S.
Конфигурация СУБД — Oracle Database 11g Express Edition Release 11.2.0.2.0
IDE — PL/SQL Developer Version 11.0.6.1776

Tags: , , ,

Leave a Reply

You must be logged in to post a comment.