纪元转换关闭 1 秒
epoch conversion off by 1 second
select from_tz(
cast(
to_date('1970-01-01 00','yyyy-mm-dd hh24')
+ (1536698971759)/1000/60/60/24
as timestamp
),
'GMT'
) at time zone 'US/Eastern'
from dual;
产量:
11-SEP-18 04.49.32.000000 PM US/EASTERN
然而,如果您将 1536698971759
插入任何在线转换器,您将看到秒数实际上是 31,而不是 32。
怎么了?
这是隐式舍入的问题。 DATE
数据类型(由于 TO_DATE()
)不支持小数秒,因此 31.759 四舍五入为 32。
试试这个:
SELECT
(TIMESTAMP '1970-01-01 00:00:00 UTC' + 1536698971759/1000 * INTERVAL '1' SECOND) AT TIME ZONE 'US/Eastern'
FROM dual;
或(TIMESTAMP '1970-01-01 00:00:00 UTC' + NUMTODSINTERVAL(1536698971759/1000, 'SECOND')) AT TIME ZONE 'US/Eastern'
如果你愿意
yields: 11.09.2018 16:49:31.759000000 -04:00
select from_tz(
cast(
to_date('1970-01-01 00','yyyy-mm-dd hh24')
+ (1536698971759)/1000/60/60/24
as timestamp
),
'GMT'
) at time zone 'US/Eastern'
from dual;
产量:
11-SEP-18 04.49.32.000000 PM US/EASTERN
然而,如果您将 1536698971759
插入任何在线转换器,您将看到秒数实际上是 31,而不是 32。
怎么了?
这是隐式舍入的问题。 DATE
数据类型(由于 TO_DATE()
)不支持小数秒,因此 31.759 四舍五入为 32。
试试这个:
SELECT
(TIMESTAMP '1970-01-01 00:00:00 UTC' + 1536698971759/1000 * INTERVAL '1' SECOND) AT TIME ZONE 'US/Eastern'
FROM dual;
或(TIMESTAMP '1970-01-01 00:00:00 UTC' + NUMTODSINTERVAL(1536698971759/1000, 'SECOND')) AT TIME ZONE 'US/Eastern'
如果你愿意
yields: 11.09.2018 16:49:31.759000000 -04:00