В опубликованном предложении order-by вы конвертируете дату в строку, используя модель 'yyyymmddhhmmss'
.То есть месяц используется дважды - это должно быть 'yyyymmddhhmiss'
(mi
для минут, а не mm
, то есть месяц);или предпочтительно 'yyyymmddhh24miss'
, чтобы избежать путаницы AM / PM.(Нет причин для преобразования в строку для заказа здесь, но я думаю, что вы сделали это только для того, чтобы выяснить, почему она оказалась неправильной с простой датой ...)
Поскольку вывод, который вы показали, нев соответствии с указанными вами настройками NLS, вы должны конвертировать результат запроса в строку в другом месте.Предположительно, вы допустили ту же ошибку и в модели формата.
Таким образом, когда вы упорядочивали просто по значению даты (как вам следует), а не по ее строковому представлению, результаты фактически были в правильном порядке;но поскольку позже вы также указали неправильное значение для минут, только показалось неправильным.
Быстрая демонстрация с обоими вариантами упорядочения:
with pt (begin_date) as (
select to_date('2019-09-09 10:01:23', 'YYYY-MM-DD HH24:MI:SS') from dual
union all
select to_date('2019-09-09 10:02:09', 'YYYY-MM-DD HH24:MI:SS') from dual
union all
select to_date('2019-09-09 10:03:27', 'YYYY-MM-DD HH24:MI:SS') from dual
)
select begin_date,
to_char(begin_date, 'yyyymmddhhmmss') as wrong_1,
to_char(begin_date, 'mm/dd/yyyy hh:mm:ss') as wrong_2,
to_char(begin_date, 'mm/dd/yyyy hh24:mi:ss') as right_3
from pt
order by begin_date;
BEGIN_DATE WRONG_1 WRONG_2 RIGHT_3
------------------- -------------- ------------------- -------------------
2019-09-09 10:01:23 20190909100923 09/09/2019 10:09:23 09/09/2019 10:01:23
2019-09-09 10:02:09 20190909100909 09/09/2019 10:09:09 09/09/2019 10:02:09
2019-09-09 10:03:27 20190909100927 09/09/2019 10:09:27 09/09/2019 10:03:27
Когдаупорядоченные по простой дате, значения wrong_2
выглядят не в том порядке, но right_3
показывает, что порядок действительно правильный.
with ...
select begin_date,
to_char(begin_date, 'yyyymmddhhmmss') as wrong_1,
to_char(begin_date, 'mm/dd/yyyy hh:mm:ss') as wrong_2,
to_char(begin_date, 'mm/dd/yyyy hh24:mi:ss') as right_3
from pt
order by to_char(begin_date, 'yyyymmddhhmmss');
BEGIN_DATE WRONG_1 WRONG_2 RIGHT_3
------------------- -------------- ------------------- -------------------
2019-09-09 10:02:09 20190909100909 09/09/2019 10:09:09 09/09/2019 10:02:09
2019-09-09 10:01:23 20190909100923 09/09/2019 10:09:23 09/09/2019 10:01:23
2019-09-09 10:03:27 20190909100927 09/09/2019 10:09:27 09/09/2019 10:03:27
При упорядочении по (неправильной) строке,wrong_2
значения отображаются в правильном порядке, но right_3
показывает, что порядок на самом деле неправильный.