преобразование эпохи на 1 секунду - PullRequest
0 голосов
/ 26 сентября 2018
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 к любому онлайн-конвертеру, вы увидите, что количество секунд фактически составляет 3 1 , а не 3 2 .

Что не так?

1 Ответ

0 голосов
/ 26 сентября 2018

Это проблема с неявным округлением.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...