【问题标题】:Difference between unix_timestamp and casting to timestampunix_timestamp 和强制转换为时间戳之间的区别
【发布时间】:2020-05-13 11:34:57
【问题描述】:

我有一个配置单元表的情况,将两个数字字符串字段(T1 和 T2)转换为日期时间戳格式“YYYY-MM-DD hh:mm:ss.SSS”并找出两者的区别. 我试过两种方法:

  • 方法一:通过CAST
Select CAST(regexp_replace(substring(t1, 1,17),'(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})','$1-$2-$3 $4:$5:$6.$7') as timestamp), CAST(regexp_replace(substring(t2, 1,17),'(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})','$1-$2-$3 $4:$5:$6.$7') as timestamp), CAST(regexp_replace(substring(t1, 1,17),'(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})','$1-$2-$3 $4:$5:$6.$7') as timestamp) - CAST(regexp_replace(substring(t2, 1,17),'(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})','$1-$2-$3 $4:$5:$6.$7') as timestamp) as time_diff
from tab1

得到输出

  • 方法二:通过unix_timestamp
Select from_unixtime (unix_timestamp(substring(t1,1,17),'yyyyMMddhhmmssSSS'),'yyyy-MM-dd hh:mm:ss.SSS'), from_unixtime (unix_timestamp(substring(t2,1,17),'yyyyMMddhhmmssSSS'),'yyyy-MM-dd hh:mm:ss.SSS'), from_unixtime (unix_timestamp(substring(t1,1,17),'yyyyMMddhhmmssSSS'),'yyyy-MM-dd hh:mm:ss.SSS') - from_unixtime (unix_timestamp(substring(t2,1,17),'yyyyMMddhhmmssSSS'),'yyyy-MM-dd hh:mm:ss.SSS') as time_diff
from tab1;

得到输出

我不清楚为什么输出会有差异。

【问题讨论】:

    标签: hive hql hiveql


    【解决方案1】:

    unix_timestamp() 为您提供纪元时间,即。自 unix epoch 1970-01-01 00:00:00 以来的时间(以秒为单位) 而时间戳将提供日期和时间,即 YYYY-MM-DD T HH:MI:SS 因此,一种准确的方法是将字符串时间戳转换为 unix_timestamp(),减去然后使用 from_unixtime() 转换回来 例如。

    select from_unixtime(unix_timestamp('2020-04-12 01:30:02.000') - unix_timestamp('2020-04-12 01:29:43.000'))
    

    【讨论】:

      【解决方案2】:

      方法2最终等同于这样的东西

      select ('2020-04-12 01:30:02.000' - '2020-04-12 01:29:43.000') as time_diff;
      

      你不能像这样减去日期。你必须使用 DateDiff。

      在 Hive 中 DateDiff 仅在当天有差异时返回 > 0,否则您将得到零。

      【讨论】:

      • DateDiff() 将给出日期而不是时间的差异。
      • UNIX_TIMESTAMP('2017-12-05 10:01:30') - UNIX_TIMESTAMP('2017-12-05 10:00:00') AS time_diff -- 这将返回 90(秒) .
      猜你喜欢
      • 2011-05-19
      • 2019-06-17
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2012-02-29
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多