Проблема в том, что вы пытаетесь преобразовать столбец, который уже является датой, используя TO_DATE
TO_DATE
, преобразует символ в CHAR,Тип данных VARCHAR2, NCHAR или NVARCHAR2 со значением типа данных DATE.
Поскольку вы предоставили первый аргумент как тип DATE
, Oracle неявно преобразует его в строку, используя параметры NLS вашего сеанса.
Таким образом, to_date(column2, 'dd-mon-yyyy')
эквивалентенна
SELECT TO_DATE(TO_CHAR(DATE '2016-07-08', ( -- 08-July-2016
SELECT value
FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT'
) ),'dd-mon-yyyy')
FROM dual
10-jul-16
- это то, что вы видите выше (опять же из-за формата NLS вашего сеанса), но на самом деле это 10-jul-0016
а не 10-Jul-2016
, тогда как выражение to_date(column2, 'dd-mon-RR')
оценивается как 08-jul-2016
.Это потому, что ваш NLS_DATE_FORMAT
установлен на 'DD-MON-RR'
, если я не ошибаюсь.
Итак, странное число, которое вы видите, это разница между двумя датами.
Если вы хотитечтобы подтвердить, просто запустите это.т.е. вычитание литералов даты как чистых дат без преобразования.
SELECT DATE '0016-08-03' - DATE '2016-07-08' FROM dual;-- -730461