将TIMESTAMPL(timestamp long)转换成TIMESTAMP以60结尾

Convert TIMESTAMPL (timestamp long) to TIMESTAMP ends with 60

我有一个 OData 服务 returning 一些 DateTime 值。它们在后端的 table 中保存为 TIMESTAMPL(与其他一些数据)。

现在有值 20160630084459.5000。用MOVE-CORRESPONDING改成et_entityset,这里是TIMESTAMP。由于四舍五入,它得到 20160630084460,因为秒数必须在 0059 之间,所以这不是 return 的有效值。

我的主要问题是,我的 table 条目非常多,因此我需要一种高效的方法来修复此错误。

首先你的 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

您在问题中提到了地板,但事实并非如此。该值是四舍五入的。如果您简单地在从 TIMESTAMPL 到 TIMESTAMP 的分配中使用 FLOOR,您将得到您想要的答案。如果您必须使用 MOVE-CORRESPONDING,只需先执行此操作,然后对时间戳进行单独分配。

然而,这意味着 0:59.9 将被翻译成 0:59 而不是 1:00。如果缺少的那一秒对您的应用程序来说没问题,那么只需使用 FLOOR 命令。否则,它会变得更加复杂,并且您的性能会受到影响。