HSQLDB (HyperSQL) - как получить метку времени UNIX как число с точностью до мс - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь получить метку времени в стиле Java long, то есть метку времени UNIX с точностью до миллисекунды * 1000, которая соответствует типу без плавающей запятой (BIGINT).

Я не нашел способа получить это прямо из какой-то функции, например CURRENT_TIMESTAMP, если только у меня не было нормального форматирования, например 20181010123059123.

Так что я обнаружил, что это даст мне нечто, похожее на число:

(CURRENT_TIMESTAMP - TIMESTAMP '2018-01-01 00:00:00') SECOND TO SECOND
-- Gives: 23649115.452000

Обратите внимание, что я вычитаю 2018-..., поскольку меня волнует только дельта, а не абсолютная дата.

Я не уверен, что этопростой способ.
Оказывается, типом этого является ИНТЕРВАЛ, поэтому мне нужно преобразовать:

CAST(
    (CURRENT_TIMESTAMP - TIMESTAMP '2018-01-01 00:00:00') SECOND TO SECOND
    AS DECIMAL(15,3)
)
-- Gives 23649115.000

Теперь проблема в том, что точность потеряна.
Так что мне интересно: Где это.452 потеряно и как мне его сохранить?Это то, что руководство говорит :

Значение интервала может быть приведено к числовому типу.В этом случае значение интервала сначала преобразуется в однополевый тип INTERVAL с тем же полем, что и наименее значимое поле значения интервала.Затем значение преобразуется в целевой тип.Например, CAST (INTERVAL '1-11' YEAR TO MONTH AS INT) оценивается как INTERVAL '23' MONTH, а затем 23.

И последний вопрос:
Какмогу ли я получить UNIX-метку в формате UNIX с некоторого момента, например, начало эпохи UNIX?

Мой текущий полный SQL:

SELECT  
(CURRENT_TIMESTAMP - TIMESTAMP '2018-01-01 00:00:00') SECOND TO SECOND,
FLOOR(
     CAST(
      (CURRENT_TIMESTAMP - TIMESTAMP '2018-01-01 00:00:00') SECOND TO SECOND
       AS DECIMAL(15,3)
     ) * 1000
) 
FROM (VALUES(0));
-- Gives: 23649115.452000 | 23649115000

1 Ответ

0 голосов
/ 01 октября 2018

Оказывается, есть UNIX_MILLIS, который я пропустил (потому что руководство по неправильному формату PDF мешает правильному поиску).

SELECT  UNIX_MILLIS() FROM (VALUES(0)) 

, что делает мои попытки выше приятных упражнений с интервалами.

Мне все еще интересно, как мне CAST интервал, чтобы сохранить миллисекундную часть.

...