Я пытаюсь получить метку времени в стиле 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