Порядок по дате не работает должным образом - PullRequest
0 голосов
/ 26 сентября 2019

Я пишу процедуру PL / SQL, которая сообщает информацию о деятельности по дате.Там, где я упорядочиваю по необработанному полю Date (type is date), порядок сортировки выглядит неправильно.если я конвертирую его с помощью to_char, он работает;но у to_char могут быть свои проблемы.Почему это происходит?

Я попытался упорядочить в поле базы данных PT.BEGIN_DATE и попробовал его с to_char, показанным ниже.

select  PT.BEGIN_DATE, PT.TRAN_TYPE || '/' || PT.TRAN_CODE as TRAN,
   PT.TRAN_NBR, PT.MODULE_NAME, PT.MENU_OPTN_NAME,  
   TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(PT.END_DATE - PT.BEGIN_DATE, 'DAY')), 'FM00') || ':' ||
  TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(PT.END_DATE - PT.BEGIN_DATE, 'DAY')), 'FM00') || ':' ||
  TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(PT.END_DATE - PT.BEGIN_DATE, 'DAY')), 'FM00') as Elapsed,
  SU.USER_NAME, COALESCE(trim(IM.SKU_BRCD), ' '), COALESCE(trim(PT.CNTR_NBR),'  '), COALESCE(trim(PT.WAVE_NBR), ' '), COALESCE(trim(PT.PKT_CTRL_NBR), ' '), COALESCE(trim(PT.PKT_SEQ_NBR), ' '), 
  PT.NBR_UNITS, COALESCE(trim(LH1.LOCN_BRCD), ' ') as FROM_LOCN, COALESCE(trim(LH2.LOCN_BRCD), ' ') as TO_LOCN, COALESCE(trim(PT.OLD_STAT_CODE), ' '), COALESCE(trim(PT.NEW_STAT_CODE), ' '), 
  COALESCE(trim(PT.WKSTN_ID), ' '), PT.USER_ID, PT.END_DATE
from ACT_TRACK_TRAN PT
   left join SKU_MASTER IM on IM.SKU_ID = PT.SKU_ID
   left join LOCN_MASTER LH1 on LH1.LOCN_ID = PT.FROM_LOCN
   left join LOCN_MASTER LH2 on LH2.LOCN_ID = PT.TO_LOCN
   left join SEC_USER SU on SU.LOGIN_USER_ID = PT.USER_ID
   where pt.MASTER_ID = v_CD and PT.SKU_ID like v_SKUID and PT.USER_ID   
like v_USER and PT.PKT_CTRL_NBR like v_PKT and PT.CNTR_NBR Like v_CNTR 
   and trunc(PT.BEGIN_DATE) between trunc(v_START) and trunc(v_STOP)
   ORDER BY to_char(PT.BEGIN_DATE, 'yyyymmddhhmmss') ;

Результаты, как показано выше:

Start Date/Time    
------------------- 
09/09/2019 10:09:09 
09/09/2019 10:09:23 
09/09/2019 10:09:27

Результаты при сортировке только по PT_BEGIN_DATE

Start Date/Time     
------------------- 
09/09/2019 10:09:23 
09/09/2019 10:09:09 
09/09/2019 10:09:27

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

В опубликованном предложении 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 показывает, что порядок на самом деле неправильный.

0 голосов
/ 26 сентября 2019

Преобразовать в дату перед сортировкой, например .. ЗАКАЗАТЬ ПО КОНВЕРТУ (DATE, PT.BEGIN_DATE) ASC

...