使用 unix_timestamp() 将字符串时间戳转换为秒。小时差异将是:
hive> select (unix_timestamp('2018-07-16 02:23:00')- unix_timestamp('2018-07-16 02:36:00'))/60/60;
OK
-0.21666666666666667
重要更新:仅当时区配置为 UTC 时,此方法才能正常工作。因为对于某些边缘情况的 DST 时区,Hive 在时间戳操作期间转换时间。考虑 PDT 时区的这个例子:
hive> select hour('2018-03-11 02:00:00');
OK
3
注意小时是3
,不是2
。这是因为2018-03-11 02:00:00
不能存在于 PDT 时区,因为恰好在2018-03-11 02:00:00
时间被调整为2018-03-11 03:00:00
. 转换为 unix_timestamp 时也会发生同样的情况。对于 PDT 时区 unix_timestamp('2018-03-11 03:00:00') 和 unix_timestamp('2018-03-11 02:00:00') 将返回相同的时间戳:
hive> select unix_timestamp('2018-03-11 03:00:00');
OK
1520762400
hive> select unix_timestamp('2018-03-11 02:00:00');
OK
1520762400
并提供几个链接供您参考:
https://community.hortonworks.com/questions/82511/change-default-timezone-for-hive.html
http://boristyukin.com/watch-out-for-timezones-with-sqoop-hive-impala-and-spark-2/
也请看看这个jira:Hive应该在UTC中进行时间戳计算