unix_timestamp 和强制转换为时间戳之间的区别

Posted

技术标签:

【中文标题】unix_timestamp 和强制转换为时间戳之间的区别【英文标题】:Difference between unix_timestamp and casting to 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),'(\\d4)(\\d2)(\\d2)(\\d2)(\\d2)(\\d2)(\\d3)','$1-$2-$3 $4:$5:$6.$7') as timestamp), CAST(regexp_replace(substring(t2, 1,17),'(\\d4)(\\d2)(\\d2)(\\d2)(\\d2)(\\d2)(\\d3)','$1-$2-$3 $4:$5:$6.$7') as timestamp), CAST(regexp_replace(substring(t1, 1,17),'(\\d4)(\\d2)(\\d2)(\\d2)(\\d2)(\\d2)(\\d3)','$1-$2-$3 $4:$5:$6.$7') as timestamp) - CAST(regexp_replace(substring(t2, 1,17),'(\\d4)(\\d2)(\\d2)(\\d2)(\\d2)(\\d2)(\\d3)','$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;

得到输出

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

【问题讨论】:

【参考方案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(秒) .

以上是关于unix_timestamp 和强制转换为时间戳之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期和时间转换为时间戳

MySQL中from_unixtime和unix_timestamp处理数据库时间戳转换问题-案例

MySQL中from_unixtime和unix_timestamp处理数据库时间戳转换问题-案例

将日期和时间转换为时间戳 [重复]

mysql语句中的时间格式化转换

Hive unix_timestamp 函数计算不匹配