需要从蜂巢中的给定时间戳中减去一些小时

Need to subtract some hours from given timestamp in hive

输入:unix_timestamp('01/15/2018 15:26:37', 'mm/dd/YYYY hh:mm:ss')

预期输出比 utc 输入时间延迟 4 小时,即 01/15/2018 11:26:37

我知道 hive 中有 date_sub 函数,但它仅用于从给定时间戳中减去天数。但我需要知道是否有一种方法可以减去小时、分钟或秒。

我也尝试过类似下面的方法,因为 EDT 时区比 UTC 晚 4 小时(但输出错误):

SELECT to_date(from_UTC_timestamp(unix_timestamp('01/15/2018 15:26:37', 'mm/dd/YYYY hh:mm:ss')*1000, 'EST6EDT')) as earliest_date; -- OUTPUT: 2017-12-31 (wrong) 

谁能帮我解决这个问题?

它工作正常。

select from_unixtime(unix_timestamp('01/15/2018 15:26:37', 'MM/dd/yyyy HH:mm:ss')-4*3600, 'MM/dd/yyyy HH:mm:ss') 

除了

我发现将这样长的表达式定义为宏并放在初始化文件中非常有用(例如 hive -i init-file.hql ...)。

hive> create temporary macro sub_hours(dt string, hours int)
from_unixtime(unix_timestamp(dt, 'MM/dd/yyyy HH:mm:ss') - 3600 * hours, 'MM/dd/yyyy HH:mm:ss');
OK
Time taken: 0.005 seconds
hive> select sub_hours("01/01/2019 00:00:00", 5);
OK
12/31/2018 19:00:00
Time taken: 0.439 seconds, Fetched: 1 row(s)

宏从 Hive 0.12.0 开始可用,可以找到更多详细信息 here(注意 "bug fixes" 部分)。

例如您在特定时区的当前时间 - 1 小时:

select date_format(
        from_utc_timestamp(CURRENT_TIMESTAMP(),'Europe/Madrid') - INTERVAL 1 hours,
        'yyyy-MM-dd HH:mm:ss')
     as PREVIOUS_HOUR