Функция даты ANSI SQL в Oracle
Я понимаю, что могу использовать комбинацию to_char и to_date, а не то, что можно обойти, но я пытаюсь выяснить, почему это не работает. Я использую Oracle 12.1
select '2016-10-01'
from dual
union all
select to_char(2016)||'-10-01'
from dual;
Каждая из сторон объединения производит одинаковую продукцию: 2016-10-01. Если я тогда попытаюсь использовать синтаксис даты ANSI (как описано здесь: http://blog.tanelpoder.com/2012/12/29/a-tip-for-lazy-oracle-users-type-less-with-ansi-date-and-timestamp-sql-syntax/), он работает только для первого, а не для второго:
select date '2016-10-01'
from dual
Возвращает: 1.10.2016
Но если я попробую это:
select date to_char(2016)||'-10-01'
from dual;
Я получаю:
ORA_00936 отсутствует ошибка выражения.
Я могу закодировать обходной путь, но я озадачен тем, почему один работает, а другой нет.
1 ответ
Так не получится, потому что DATE
это не функция, а литерал.
Термины буквальное и постоянное значение являются синонимами и относятся к фиксированному значению данных.
Дата Литералы
Вы можете указать значение DATE в виде строкового литерала или преобразовать символьное или числовое значение в значение даты с помощью функции TO_DATE. Литералы DATE - единственный случай, когда Oracle Database принимает выражение TO_DATE вместо строкового литерала.
Вы могли бы использовать TO_DATE
функция.
select TO_DATE(to_char(2016)||'-10-01', 'YYYY-MM-DD')
from dual;
РЕДАКТИРОВАТЬ:
Использование динамического SQL:
DECLARE
i DATE;
stmt VARCHAR2(100);
BEGIN
stmt := q'{SELECT DATE '}' || TO_CHAR(2016) || '-01-01' || q'{' FROM dual}';
EXECUTE IMMEDIATE stmt INTO i;
DBMS_OUTPUT.PUT_LINE('i =>' || i);
END;