【问题标题】:Hive: Reduce millisecond precision in timestampHive:降低时间戳的毫秒精度
【发布时间】:2020-03-18 01:51:12
【问题描述】:

在 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 完全映射

【问题讨论】:

    标签: hive timestamp hiveql precision


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2011-12-30
      • 2023-03-17
      • 2014-10-21
      • 2018-10-10
      相关资源
      最近更新 更多