蜂巢:降低时间戳的毫秒精度

时间:2019-11-22 02:33:16

标签: hive timestamp hiveql precision

在Hive中,是否有降低毫秒精度(不舍入)的方法?

例如,我有以下时间戳,毫秒数在小数点后3位

2019-10-08 21:21:39.163

我想获得一个恰好在小数点后1位的时间戳(删除最后两个毫秒63):

2019-10-08 21:21:39.1

我只能将时间戳转换为具有一个值精度的十进制:

cast(floor(cast(2019-10-08 21:21:39.163 AS double)/0.100)*0.100 AS decimal(16,1)) AS updatetime

这给出了:

1570537299.1

问题:我不知道如何将上述值转换​​为毫秒级的时间戳。更好的是,如果有更好的方法将时间戳精度从3位降低到1位小数,我将不胜感激。

我必须将上面的代码转换为十进制的原因是因为如果我只这样做:

floor(cast(2019-10-08 21:21:39.163 AS double)/0.100)*0.100 AS exec_time

这给出了类似的内容:

1570537299.100000001

这不好,因为我需要将此表X与另一个表Y连接起来。 表X的时间戳类似于2019-10-08 21:21:39.163。 但是表Y以每100ms的间隔存储数据,其时间戳正好是:2019-10-08 21:21:39.1 尾随的00000001将阻止表X中的时间戳准确地与表Y映射

1 个答案:

答案 0 :(得分:0)

如果您需要删除最后两毫秒,请使用substr()并在必要时再次强制转换为时间戳。例如:

with your_data as
(
select timestamp('2019-10-08 21:21:39.163') as original_timestamp --your example
)

select original_timestamp, 
       substr(original_timestamp,1,21)            truncated_string,
       timestamp(substr(original_timestamp,1,21)) truncated_timestamp --this may be not necessary, timestamp is compatible w string
from your_data

返回:

original_timestamp      truncated_string        truncated_timestamp
2019-10-08 21:21:39.163 2019-10-08 21:21:39.1   2019-10-08 21:21:39.1