sfd
Печеньки от Oracle. Иерархический запрос
В таблице одна строка. Как извлечь из нее 10 строк? Как сформировать последовательность? Календарь? Побочные "плюшки" иерархического SQL запроса в Oracle. Таблица dual Если нам нужно получить SQL запросом текущую дату, то в Oracle мы пишем: select sysdate from dual
;
31.03.19 В некоторых диалектах SQL для скаляра (текущая дата - скаляр) можно записать без from dual, но Oracle требует полноты минимальной конструкции выражения для чтения данных: select <список столбцов> from <список таблиц> Служебная таблица dual как раз и наличествует в системе для формализации выборок "из ниоткуда"...
Поиск по дате на 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