2016-06-30 31 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命令即可。如果不是,它會變得更加複雜,並且你會受到性能影響。