Подробнее об извлечении года с даты - Oracle - PullRequest
0 голосов
/ 06 февраля 2020

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

Учитывая, что 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, но здесь дело не в этом.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Вы не можете извлечь год из строки (которой является '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>
0 голосов
/ 06 февраля 2020

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

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

SELECT TO_CHAR(cast('6-feb-2019' as date),'YYYY') FROM DUAL;
...