Имеется таблица изменений курса валют 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