将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
,因为秒数必须在 00
和 59
之间,所以这不是 return 的有效值。
我的主要问题是,我的 table 条目非常多,因此我需要一种高效的方法来修复此错误。
首先你的 TIMESTAMPL
值不正确。前八个位置不符合 YYYYMMDD
模式。所以我认为它应该是 20160630084459.5000
而不是 20163006084459.5000
(20160630
与 20163006
)。
第二个是将其转换为您想要的内容的方法。
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 命令。否则,它会变得更加复杂,并且您的性能会受到影响。
我有一个 OData 服务 returning 一些 DateTime
值。它们在后端的 table 中保存为 TIMESTAMPL
(与其他一些数据)。
现在有值 20160630084459.5000
。用MOVE-CORRESPONDING
改成et_entityset
,这里是TIMESTAMP
。由于四舍五入,它得到 20160630084460
,因为秒数必须在 00
和 59
之间,所以这不是 return 的有效值。
我的主要问题是,我的 table 条目非常多,因此我需要一种高效的方法来修复此错误。
首先你的 TIMESTAMPL
值不正确。前八个位置不符合 YYYYMMDD
模式。所以我认为它应该是 20160630084459.5000
而不是 20163006084459.5000
(20160630
与 20163006
)。
第二个是将其转换为您想要的内容的方法。
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 命令。否则,它会变得更加复杂,并且您的性能会受到影响。