17 подписчиков
Поиск по дате на Oracle

Задача

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

CODE  varchar2(32)  Код валюты (USD, RUR, …)
DATE_C date Дата изменения курса
VALUE  number Значение курса

Необходимо написать SQL запрос, с помощью которого можно получить значение курса для заданной валюты на заданную дату.

Решение

Создаю структуру

CREATE TABLE T_CURRENCY (
  CODE VARCHAR2(32),
  DATE_C DATE,
  VALUE NUMBER
);
/

Наполняю структуру данными

INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-13 16:00:00','YYYY-MM-DD HH24:MI:SS') , 64.760);
INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-13 20:00:00','YYYY-MM-DD HH24:MI:SS') , 64.834);
INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-14 08:00:00','YYYY-MM-DD HH24:MI:SS') , 65.209);
INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-14 12:00:00','YYYY-MM-DD HH24:MI:SS') , 65.460);
COMMIT;

Проверяю выборку

SELECT CODE,
   TO_CHAR(DATE_C, 'YYYY-MM-DD HH24:MI:SS') AS DATE_TIME,
   VALUE
 FROM T_CURRENCY;

Вижу

CODE DATE_TIME   VALUE
USD 2019-08-13 16:00:00 64.76
USD 2019-08-13 20:00:00 64.834
USD 2019-08-14 08:00:00 65.209
USD 2019-08-14 12:00:00 65.46

Для того, чтобы найти курс на указанную дату и время (например, на 2019-08-14 09:45), воспользуемся следующим запросом с подзапросом:

SELECT CODE,
   TO_CHAR(DATE_C, 'YYYY-MM-DD HH24:MI:SS') AS DATE_TIME,
   VALUE FROM T_CURRENCY
 WHERE CODE = 'USD'
  AND DATE_C IN (
   SELECT MAX(DATE_C)
   FROM T_CURRENCY
   WHERE DATE_C <= TO_DATE('2019-08-14 09:45:00','YYYY-MM-DD HH24:MI:SS')
  );

Результат:

CODE DATE_TIME   VALUE
USD 2019-08-14 08:00:00 65.209
9 месяцев назад