2016-06-30 32 views
4

我有一个OData服务返回一些DateTime值。它们被保存在后端的表格中,作为TIMESTAMPL(以及其他一些数据)。将TIMESTAMPL(timestamp long)转换为TIMESTAMP以60结尾

现在值为'20160630084459.5000'。将MOVE-CORRESPONDING放入'et_entityset'中,它是'TIMESTAMP'。由于四舍五入,它得到'20160630084460',因为秒必须在'00'和'59'之间,这不是一个有效的值。

我的主要问题是,我的表有极其多的条目,所以我需要一个高性能的方法来解决这个错误。

无效的时间戳是一个错字,THX

回答

2

首先你TIMESTAMPL值不正确。前八个位置不符合YYYYMMDD模式。所以我认为它应该是20160630084459.5000而不是20163006084459.50002016063020163006)。

其次,这里有一种方法可以将它转换为你想要的。

REPORT zzy NO STANDARD PAGE HEADING. 

FORM convert_timestamp. 
    DATA(l_t1) = CONV timestampl('20160630084459.5000'). 
    DATA: l_t2 TYPE timestamp. 
    l_t2 = l_t1. 
    WRITE/: l_t1, l_t2. 
    CONVERT TIME STAMP l_t1 TIME ZONE sy-zonlo INTO DATE DATA(l_date) TIME DATA(l_time). 
    CONVERT DATE l_date TIME l_time INTO TIME STAMP l_t2 TIME ZONE sy-zonlo. 
    WRITE/l_t2. 
ENDFORM. 

START-OF-SELECTION. 
    PERFORM convert_timestamp. 

这里是输出。

20.160.630.084.459,5000000
20.160.630.084.460
20.160.630.084.459

+0

尽管我赞成使用ABAP对象,但在这种情况下,它无法以任何方式获得关键点。 – vwegert

+0

@vwegert你能否详细说明一下?我应该使用这种简单的例子吗? – Jagger

+1

开始选择。 DATA(l_t1)= CONV时间戳('20160630084459.5000')。 CONVERT TIME STAMP l_t1 TIME ZONE sy-zonlo INTO DATE DATA(l_date)TIME DATA(l_time)。 CONVERT DATE l_date TIME l_time INTO TIME STAMP DATA(l_t2)TIME ZONE sy-zonlo。 WRITE/l_t2。 – vwegert

0

你提到地板在你的问题,但是,是不是发生了什么。该值为四舍五入。如果你简单的使用FLOOR在从TIMESTAMPL到TIMESTAMP的任务中,你会得到你想要的答案。如果您必须使用MOVE-CORRESPONDING,请先执行该操作,然后为时间戳执行单独分配。

但是,这意味着0:59.9将被转换为0:59而不是1:00。如果您的应用程序缺少第二个确定,那么只需使用FLOOR命令即可。如果不是,它会变得更加复杂,并且你会受到性能影响。