Даты не имеют внутреннего формата. У Oracle есть внутреннее представление, которое не похоже ни на что, что вы могли бы распознать как дату. Клиент или приложение решают, как отображать дату (например, используя NLS_DATE_FORMAT), или вы можете использовать TO_CHAR
для преобразования даты в строку с указанным вами форматом, как вы делаете в своем первом примере.
Во втором примере вы выполняете неявное преобразование своей фактической даты в строку, используя настройку NLS - теряя столетие в процессе, поэтому, предположительно, это YY, а не YYYY, - а затем вы конвертируете это обратно в дату. Я удивлен, что это не ошибка, когда вы меняете местами месяц и день.
Не делай этого. Преобразование в строку и обратно в дату бессмысленно, даже если ваши настройки не потеряют информацию по пути.
Если вы хотите, чтобы это была дата для клиента или другого процесса, просто выполните:
select logical_date -1
from logical_date
where logical_date_type='B'
Если вы хотите сравнить с другой датой, оставьте ее как дату:
select other_columns
from logical_date
where logical_date_type='B'
and logical_date -1 < sysdate
Если вы хотите указать формат для отображения, используйте:
select to_char(logical_date -1, 'DD/MM/YYYY')
from logical_date
where logical_date_type='B'
person
Alex Poole
schedule
10.02.2016