У меня есть вопрос о выборе года от даты. Это в базе данных Oracle 12c.

Учитывая, что SELECT trunc(SYSDATE) FROM DUAL; возвращает 02/06/2020

Они работают правильно и возвращают текущий год 2020 -

SELECT EXTRACT(YEAR FROM trunc(SYSDATE)) FROM DUAL;
SELECT TO_CHAR(trunc(SYSDATE,'YYYY')) FROM DUAL;

Они не работают и дают ошибку -

SELECT EXTRACT(YEAR FROM '02/06/2019') FROM DUAL;

Выдает ошибку: ORA-30076: invalid extract field for extract source

SELECT TO_CHAR('02/06/2019','YYYY') FROM DUAL;

Выдает ошибку: ORA-01722: invalid number

Тот же формат передается с sysdate и жестко закодированной датой 02/06/2019. Почему один работает, а другой нет?

Я знаю, что мог бы просто select 2019 from dual, но здесь дело не в этом.

0
alexherm 6 Фев 2020 в 23:06

2 ответа

Лучший ответ

Вы не можете извлечь год из строки (которая '02/06/2019'). Сначала преобразовать его в дату:

SQL> SELECT EXTRACT(YEAR FROM to_date('02/06/2019', 'dd/mm/yyyy')) year FROM DUAL;

      YEAR
----------
      2019

SQL>

Или, если вы знаете , что последние 4 цифры являются действительными, то

SQL> select substr('02/06/2019', -4) year from dual;

YEAR
----
2019

SQL>
2
Littlefoot 6 Фев 2020 в 20:08

Все сводится к типу передаваемых данных. sysdate по умолчанию является полем DATE. Жесткая дата, такая как '02/06/2020' по умолчанию, считается строкой.

Чтобы обойти это, просто приведите строку в качестве даты. Все хорошо.

SELECT TO_CHAR(cast('6-feb-2019' as date),'YYYY') FROM DUAL;
-1
alexherm 6 Фев 2020 в 20:08