как извлечь год из даты в Oracle? - PullRequest
0 голосов
/ 30 ноября 2018

Я не понимаю, почему следующий запрос не работает

SELECT stringdate, TO_DATE(TO_CHAR(stringdate),'YYYYMMDD') AS mydate,
EXTRACT(YEAR FROM MYDATE) as myyear
FROM data.repo data 
WHERE ROWNUM <10" 

Он возвращает ORA-00904: "MYDATE": invalid identifier

Тем не менее, просто запуск

SELECT stringdate, TO_DATE(TO_CHAR(stringdate),'YYYYMMDD') AS mydate

дает правильно:

stringdate    MYDATE
20150130 2015-01-30

Это сводит меня с ума.В чем проблема?Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018
Select mydate, EXTRACT(YEAR FROM MYDATE) as myyear
From (
    SELECT stringdate, TO_DATE(TO_CHAR(stringdate),'YYYYMMDD') AS mydate
          /* , EXTRACT(YEAR FROM MYDATE) as myyear */
    FROM data.repo data 
    WHERE ROWNUM <10"
 ) A
0 голосов
/ 30 ноября 2018

Проблема в том, что вы НЕ МОЖЕТЕ ссылаться на псевдоним "mydate" в том же предложении выбора.

SELECT
  stringdate
, EXTRACT(YEAR FROM MYDATE) as myyear
FROM (
    SELECT stringdate
    , TO_DATE(TO_CHAR(stringdate),'YYYYMMDD') AS mydate
    FROM data.repo data 
    WHERE ROWNUM <10
    )

Существуют и другие возможности, например

SELECT stringdate
    , TO_DATE(TO_CHAR(stringdate),'YYYYMMDD') AS mydate
    , to_number(substr(stringdate,1,4)) AS YR
FROM data.repo data 
WHERE ROWNUM <10

для использования"select *" (nb: не рекомендуется в производственном кодировании) в Oracle вам нужно o использовать псевдонимы таблицы / подзапроса, например:

SELECT
  d.*
, EXTRACT(YEAR FROM MYDATE) as myyear
FROM (
    SELECT data.*
    , TO_DATE(TO_CHAR(stringdate),'YYYYMMDD') AS mydate
    FROM data.repo data 
    WHERE ROWNUM <10
    ) d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...