Sql 按日期排序的订单未按预期运行
我正在编写一个PL/SQL过程,它按日期报告有关活动的信息。其中,我在原始日期(类型为Date)字段中的order by排序不正确。如果我把它转换成字符,它就会工作;但to_char也有自己的问题。为什么会这样 我在数据库字段PT.BEGIN\u DATE上尝试了order by,并使用下面显示的to\u字符进行了尝试Sql 按日期排序的订单未按预期运行,sql,oracle,sql-order-by,Sql,Oracle,Sql Order By,我正在编写一个PL/SQL过程,它按日期报告有关活动的信息。其中,我在原始日期(类型为Date)字段中的order by排序不正确。如果我把它转换成字符,它就会工作;但to_char也有自己的问题。为什么会这样 我在数据库字段PT.BEGIN\u DATE上尝试了order by,并使用下面显示的to\u字符进行了尝试 select PT.BEGIN_DATE, PT.TRAN_TYPE || '/' || PT.TRAN_CODE as TRAN, PT.TRAN_NBR, PT.MO
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_开始日期排序时的结果
Start Date/Time
-------------------
09/09/2019 10:09:23
09/09/2019 10:09:09
09/09/2019 10:09:27
在排序之前将其转换为日期,如。。
ORDER BY CONVERT(DATE,PT.BEGIN_DATE)ASC在您的posted ORDER BY子句中,您正在使用模型
'yyyyymmddhhmmss'
将日期转换为字符串。即使用月份两次-它应该是'yyyymmddhhmis'
(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
当按普通日期排序时,error_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
当按(不正确)字符串排序时,
错误的\u 2
值似乎顺序正确,但正确的\u 3
显示顺序实际上是错误的。只需使用按PT.开始日期排序
,类型是日期
,不是吗?(为什么要尝试转换为字符串?)我尝试了,但得到了如上所示的错误结果尝试ORDER BY to_char(PT.BEGIN_DATE,'yyyymmddhh24mmss')
或者更简单的ORDER BY PT.BEGIN_DATE
。为什么要使用来存储字符呢?REGEXP\u SUBSTR(NUMTODSINTERVAL(PT.END\u DATE-PT.BEGIN\u DATE,'DAY'),'\d{2}:\d{2}:\d{2}'),因为经过的时间会更短。
谢谢大家的帮助,但我必须将此源代码发送回代码库以供审阅。所以我现在就不说了,这不是Oracle语法。从日期转换成字符串,然后再转换回日期是没有意义的,就是这样。我太专注于订单了,连看都没看。谢谢你的解释!!谢谢你,兄弟@DocMac-如果这确实是您发布的问题的正确答案,请不要忘记相应地标记它。