ORA-01861 Литерал не соответствует строке формата, когда я пытаюсь использовать trun c с sysdate - PullRequest
1 голос
/ 05 марта 2020

Мой заголовок в основном говорит о моей проблеме. Я набираю следующее в Oracle:

SELECT FName, Lname, TRUNC(months_between(sysdate,Bdate)/12) year

FROM EMPLYEE, works, assign

WHERE SSN = ESSN AND PNO = Pnumber AND Pname LIKE 'P%';

Когда я набираю, я просто получаю ORA-01861 Литерал не соответствует строке формата. Я пытаюсь, чтобы в нем были указаны имена и возраст сотрудников, работающих над проектами, начинающимися с P. BDATE - это дата рождения из таблицы emplyee. Его формат год-месяц-дата.

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Вам нужно будет преобразовать тип данных Bdate в Date:

SELECT FName, Lname, TRUNC(months_between(sysdate,to_date(Bdate,'YYYY-MM-DD'))/12) year

FROM EMPLYEE, works, assign

WHERE SSN = ESSN AND PNO = Pnumber AND Pname LIKE 'P%';
0 голосов
/ 05 марта 2020

Функция months_between() ожидает две даты. Когда указываются две даты, он возвращает месяцы с плавающей запятой до нескольких десятичных знаков.

Однако «Литерал ORA-01861 не соответствует строке формата» означает, что одна из дат имеет неверный формат дата.

Для БД с 12 c вы можете использовать: validate_conversion() функцию для обеспечения работы формата даты.

Предполагая, BDATE это просто строка.

SELECT CASE validate_conversion(BDATE as date) 
WHEN 1 THEN trunc(months_between(sysdate, TO_DATE(BDATE, 'YYYY-MM-DD'))/12)
WHEN 0 THEN 0
END "YEARS"
FROM EMPLYEE, works, assign
WHERE SSN = ESSN AND PNO = Pnumber AND Pname LIKE 'P%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...