将 unix 纪元时间转换为 Apache Derby 中的日期

Convert unix epoch time to a date in Apache Derby

Apache Derby 中是否有可以将 unix 纪元时间值(例如 1453974057 )转换为日期的函数?

如果你有 seconds 自 unix epoch,使用:

select
    {fn TIMESTAMPADD(SQL_TSI_SECOND, 1453974057, TIMESTAMP('1970-01-01-00.00.00.000000')) } as DT
from sysibm.SYSDUMMY1

只需将 "sysibm.SYSDUMMY1" 替换为您原来的 table,并将 1453974057 替换为您的值即可。

当处理毫秒时,它变得有点复杂,因为您不能直接使用 TIMESTAMPADD(您得到 SQL 状态 22003:结果值超出数据类型 INTEGER 的范围。)

如果你有 毫秒 自 unix 时代以来,使用:

select
    --the following block converts milliseconds since linux epoch to a timestamp
    { fn TIMESTAMPADD(
        SQL_TSI_FRAC_SECOND,
        (
            --add the millisecond component
            1453974057235 - { fn TIMESTAMPDIFF(
                SQL_TSI_SECOND,
                TIMESTAMP('1970-01-01-00.00.00.000000'),
                { fn TIMESTAMPADD(SQL_TSI_SECOND, 1453974057235/1000, TIMESTAMP('1970-01-01-00.00.00.000000')) }
            )} * 1000
         ) * 1000000,
         { fn TIMESTAMPADD(SQL_TSI_SECOND, 1453974057235/1000, TIMESTAMP('1970-01-01-00.00.00.000000')) }
    )} as FINAL_DT
from SYSIBM.SYSDUMMY1

只需将 1453974057235 的 3 个实例替换为您的值即可。

下面是基于 Fidel 回答的简化表达式:

select { fn TIMESTAMPADD(SQL_TSI_FRAC_SECOND, mod(1453974057, 1000) * 1000000,
         { fn TIMESTAMPADD(SQL_TSI_SECOND, 1453974057 / 1000,
           TIMESTAMP('1970-01-01-00.00.00.000000'))
         })
       }
from sysibm.SYSDUMMY1;

针对本地 JavaDB 实例进行了测试。