最大时间戳未给出正确的结果

时间:2013-08-06 13:02:58

标签: oracle plsql timestamp max

我有一个简单的代码来显示基于时间戳的最新错误消息:

SELECT 
            line_item || ': ' || error_msg as RejectionMsg
            FROM reqs
            WHERE reqs_number = 'XXXXXXX' 
            and  rqj_timestamp = (select max(rqj_timestamp) from reqs
            WHERE reqs_number  = 'XXXXXX' )

我的数据类似于:

rqj_timestamp         line_item Error_msg 
08-MAY-2009 14:00:04    8928    INVALID (RC4C) E
08-MAY-2009 14:00:04    8929    INVALID (R4CO) EY0
05-AUG-2013 00:13:42    11760   OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
05-AUG-2013 00:13:42    11761   OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
05-AUG-2013 00:13:42    11762   OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
05-AUG-2013 00:14:59    11763   OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
06-AUG-2013 06:55:59    11807   OO_45_ERROR_REGION_DERIV
06-AUG-2013 06:55:59    11808   OO_45_ERROR_REGION_DERIV
06-AUG-2013 06:55:59    11809   OO_45_ERROR_REGION_DERIV

我的查询是给我输出08-MAY-2009 14:00:04时间戳而不是06-AUG-2013 06:55:59时间戳。

3: INVALID (RC4C) E                                                         
3: INVALID (R4CO) EY0                      

知道我在哪里错了吗?或者我如何改进我的查询..如果我删除08-MAY-2009 14:00:04行,它的工作原理非常好。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

我认为你的时间戳不是日期或类似的数据类型,而是像nvarchar2这样的字符数据类型。将表格更改为正确的数据类型。

一个工作但不太干净的解决方案是使用像

这样的东西
cast((select max(cast(rqj_timestamp as date)) from reqs) as nvarchar2)

可能取决于国家语言设置等。 您可以使用列在外部cast中的字符数据类型。

答案 1 :(得分:0)

尝试类似(未经测试)的内容:

select *
from (
  select r.*, 
  row_number() over (partition by reqs_number order by rqj_timestamp desc nulls last) rnum
  from reqs r
  where reqs_number = 'XXXXXXX'
)
where rnum = 1;

此外,假设“rqj_timestamp”实际上是一个时间戳(或至少是一个日期)。

答案 2 :(得分:0)

感谢您指出检查数据类型..发现它是varchar,添加了to_date(rqj_timestamp,'DD-MON-YYYY HH24:MI:SS')