#sql #oracle #oracle-apex
#sql #Oracle #oracle-apex
Вопрос:
Я новичок в sql, поэтому для некоторых из вас это может быть не слишком сложно, но мне просто нужно найти длину в годах между столбцом, отображающим разные даты, и сегодняшней датой. Я не слишком уверен, что я делаю неправильно. Это выдает ошибку: ORA-01858: нечисловой символ был найден там, где ожидалось числовое значение
Это запрос
SELECT emp_lname || ', ' || emp_fname || ' ' || emp_initial AS "Employee Full Name",
emp_years,
TO_DATE('emp_hiredate','DD/MM/YYYY') - SYSDATE AS YEARS
FROM emp
Комментарии:
1. Можете ли вы четко понимать, что вы подразумеваете под «годами» между двумя датами?
Ответ №1:
Ваша непосредственная проблема, вызывающая ошибку, заключается в следующем:
TO_DATE('emp_hiredate','DD/MM/YYYY')
Вы сообщаете функции TO_DATE, что символьный строковый литерал ’emp_hiredate’ является строковым представлением даты в формате ‘ДД / ММ / ГГГГ’. Это:
символьная строка ’em’ должна интерпретироваться как день месяца; ожидается, что символьная строка ‘p’ будет ‘/’; символьная строка ‘_h’ должна интерпретироваться как месяц; ожидается, что символьная строка ‘i’ будет ‘/’;символьная строка ‘reda’ должна интерпретироваться как 4-значный год; и он не знает, что делать с ‘te’.
Я думаю, что вы имели в виду
TO_DATE(emp_hiredate,'DD/MM/YYYY')
Обратите внимание, что emp_hiredate не заключен в кавычки, что указывает на «значение столбца emp_hiredate».
Но обратите внимание, что функция TO_DATE принимает строковый ввод и преобразует его во внутренний двоичный формат _oracle для типов данных ДАТЫ. Таким образом, предполагается, что emp_hiredate является varchar2, строковым литеральным представлением даты, и, кроме того, указанное строковое литеральное представление даты находится в формате, указанном вторым аргументом вашего вызова TO_DATE . Если это так, у вас серьезный недостаток дизайна. Даты должны храниться как DATE, а не VARCHAR2 .
Если emp_hiredate уже является ДАТОЙ, то вам нужно не TO_DATE, а TO_CHAR
TO_CHAR(emp_hiredate,'DD/MM/YYYY')
Вам нужно вернуться к справочному руководству по SQL и изучить разницу между TO_DATE и TO_CHAR . Также прочитайте это.
Ответ №2:
Я бы рекомендовал months_between()
:
select floor(months_between(sysdate, emp_hiredate) / 12)
Комментарии:
1. Отлично, можно ли добавлять десятичные дроби с помощью months_between?