Нахождение продолжительности лет между сегодняшней датой и столбцом дат

#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?