Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按日期排序的订单未按预期运行_Sql_Oracle_Sql Order By - Fatal编程技术网

Sql 按日期排序的订单未按预期运行

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

我正在编写一个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.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-如果这确实是您发布的问题的正确答案,请不要忘记相应地标记它。