Различия между датами в Oracle SQL Developer между двумя датами в разных форматах - PullRequest
0 голосов
/ 05 октября 2018

Я столкнулся со странной проблемой при использовании SQL DEVELOPER, у меня есть две даты, между которыми я хотел бы получить разницу;однако я получаю неточные результаты ...

У меня есть:

 column1 with the date 03-Aug-2016
 column2 with the date 08-July-2016

при использовании функции to_date со следующими параметрами:

to_date(column1, 'dd-mon-yyyy') ==> дата отображается как 03-Aug-2016

, но столбец 2 - это другая история, поскольку она дает следующее:

to_date(column2, 'dd-mon-yyyy') ==> дата отображается как 10-July-2016

, но при использовании to_date(column2, 'dd-mon-RR') ==> дата отображается как 08-July-2016

и когда я использую следующее в своем запросеЯ получаю странное число

to_date(column1, 'dd-mon-yyyy') - to_date(column2, 'dd-mon-RR') ==> -730463

Ваша помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Проблема в том, что вы пытаетесь преобразовать столбец, который уже является датой, используя 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
0 голосов
/ 05 октября 2018

Вы пытались использовать

to_date(column1, 'dd-mon-RRRR') - to_date(column2, 'dd-mon-RRRR')

Всегда используйте RRRR, когда вы работаете с датами.это обеспечит формат даты в соответствии с y2k.

Если это не решит вашу проблему, пожалуйста, поделитесь типами столбцов, которые у вас есть для этих Column1 и Column2

...