0

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

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 行,它工作得很好。

提前感谢您的帮助。

4

3 回答 3

0

感谢您指出检查数据类型..原来它是 varchar,添加to_date(rqj_timestamp,'DD-MON-YYYY HH24:MI:SS') 工作。

于 2013-08-07T09:48:33.743 回答
0

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

一个有效但不太干净的解决方案是使用类似的东西

cast((select max(cast(rqj_timestamp as date)) from reqs) as nvarchar2)

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

于 2013-08-06T13:05:50.463 回答
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”实际上是一个时间戳(或至少是一个日期)。

于 2013-08-06T13:12:04.010 回答