long
时间戳,即UNIX时间戳,精度为毫秒*1000,适合非浮点类型(
BIGINT
).
我没办法直接从某个函数中得到它,比如
CURRENT_TIMESTAMP
,除非我可以使用20181010123059123这样的格式。
(CURRENT_TIMESTAMP - TIMESTAMP '2018-01-01 00:00:00') SECOND TO SECOND
-- Gives: 23649115.452000
请注意,我正在减少
2018-...
因为我只关心三角洲,而不是绝对日期。
我不确定这是不是简单的方法。
结果这是INTERVAL类型,所以我需要转换:
CAST(
(CURRENT_TIMESTAMP - TIMESTAMP '2018-01-01 00:00:00') SECOND TO SECOND
AS DECIMAL(15,3)
)
-- Gives 23649115.000
现在的问题是,精确性丧失了。
所以我想知道:哪里是
.452
迷路了,我怎么能留着?这就是
the manual says
:
间隔值可以转换为数值类型。在这种情况下,首先将间隔值转换为具有与间隔值的最低有效字段相同字段的单个字段间隔类型。然后将该值转换为目标类型。例如,CAST(INTERVAL'1-11'YEAR TO MONTH AS INT)的计算结果是INTERVAL'23'MONTH,然后是23。
最终的问题是:
从某个时刻(例如UNIX epoch开始)开始,我如何获得UNIX时间戳之类的毫秒数?
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