此示例为您的配置单元代码中具有系统时区 TZ 的硬连线值的问题提供了解决方案。它在 Centos 环境中使用 hive 0.10.0 运行,OpenJDK java 版本为 1.6。因为它涉及时间操作,所以那些精确的软件版本可能很重要。目前,该系统在 EDT 中运行。表 tblFiniteZahl 就像一个 DUAL 但有大约一百万行,你猜对了,是有限的数字。但是您可以用至少 1 行替换任何表。诀窍是在本地时区中格式化时间,但使用 z 格式来捕获时区,然后在运行时提取该值以传递给 to_utc_timestamp 函数。
select D1,
D1E,
D1L,
D1LT,
D1LZ,
to_utc_timestamp(D1LT, D1LZ) as D1UTC
from (
select D1,
D1E,
D1L,
regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 1) as D1LT,
regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 2) as D1LZ
from (
select D1,
D1E,
from_unixtime(D1E, 'yyyy-MM-dd HH:mm:ss z') as D1L
from (
select D1,
unix_timestamp(D1,'yyyy-MM-dd HH:mm:ss Z') as D1E
from (
select '2015-08-24 01:15:23 UTC' as D1
from tblFiniteZahl
limit 1
) T1
) T2
) T3
) T4
;
结果是
D1 = 2015-08-24 01:15:23 UTC
DT3 = 1440378923
D1L = 2015-08-23 21:15:23 EDT
D1LT = 2015-08-23 21:15:23
D1LZ = EDT
D1UTC = 2015-08-23 21:15:23
这说明 to_utc_timestamp 确实采用了 EDT 的第二个参数。