HSQLDB (HyperSQL) - 如何以毫秒精度将 UNIX 时间戳作为数字获取

Posted

技术标签:

【中文标题】HSQLDB (HyperSQL) - 如何以毫秒精度将 UNIX 时间戳作为数字获取【英文标题】:HSQLDB (HyperSQL) - how to get UNIX timestamp as a number with ms precision 【发布时间】:2018-10-01 15:28:20 【问题描述】:

我正在尝试获取 Java 风格的 long 时间戳,即毫秒精度 * 1000 的 UNIX 时间戳,它适合非浮点类型 (BIGINT)。

我没有找到直接从某个函数(例如 CURRENT_TIMESTAMP)获取它的方法,除非我可以接受 20181010123059123 之类的格式。

所以我发现这会给我一些看起来像数字的东西:

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

请注意,我要减去 2018-...,因为我只关心增量,而不是绝对日期。

我不确定这是否是最简单的方法。 原来 this 的类型是 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:

区间值可以转换为数值类型。在这种情况下,间隔值首先被转换为具有与间隔值的最低有效字段相同的字段的单字段 INTERVAL 类型。然后将该值转换为目标类型。例如 CAST (INTERVAL '1-11' YEAR TO MONTH AS INT) 计算结果为 INTERVAL '23' MONTH,然后是 23。

最终的问题是:我怎样才能从某个时刻获得类似于 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】:

原来我忽略了UNIX_MILLIS(因为损坏的 PDF 格式手册阻止了正确搜索)。

SELECT  UNIX_MILLIS() FROM (VALUES(0)) 

这使我的尝试超越了间歇性的好练习。

我还是想知道,我应该如何CAST一个间隔来保留毫秒部分。

【讨论】:

VALUES CAST(UNIX_MILLIS() AS DECIMAL(18,3)) / 1000 注意你不需要 SELECT

以上是关于HSQLDB (HyperSQL) - 如何以毫秒精度将 UNIX 时间戳作为数字获取的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hypersql 数据库(HSQLDB)中设置 Rank 函数

如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?

HyperSQL / HSQLDB 数据库能抵抗密码攻击吗?

HyperSQL (HSQLDB) 显式共享(读取)锁语法

HyperSQL 链接参数中文件的路径

如何从 C# 连接到 HyperSQL DB