Hive 配置单元:减少时间戳的毫秒精度

Hive 配置单元:减少时间戳的毫秒精度,hive,timestamp,hiveql,precision,Hive,Timestamp,Hiveql,Precision,在Hive中,是否有任何方法可以降低毫秒精度(不舍入) 例如,我有以下时间戳,小数点后3位为毫秒 2019-10-08 21:21:39.163 我想得到精确到小数点后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 问题:我不知道如

在Hive中,是否有任何方法可以降低毫秒精度(不舍入

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

2019-10-08 21:21:39.163
我想得到精确到小数点后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以每100毫秒的间隔存储数据,其时间戳正好是:
2019-10-08 21:21:39.1

尾随的00000001将阻止表X的时间戳与表Y精确映射

如果需要删除最后两毫秒,请使用
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

如果需要删除最后两毫秒,请使用
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