代码之家  ›  专栏  ›  技术社区  ›  Ondra Žižka David Lilljegren

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

  •  0
  • Ondra Žižka David Lilljegren  · 技术社区  · 7 年前

    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
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Ondra Žižka David Lilljegren    7 年前

    结果发现 UNIX_MILLIS 我忽略了(因为破损的PDF格式手册妨碍了正确的搜索)。

    SELECT  UNIX_MILLIS() FROM (VALUES(0)) 
    

    我还在想,我该怎么办 CAST 保留毫秒部分的间隔。