Функция даты 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;

Rextester Demo

РЕДАКТИРОВАТЬ:

Использование динамического 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;
Другие вопросы по тегам