在 Firebird 数据库中将 DOUBLE 列转换为 TIMESTAMP

Convert DOUBLE column to TIMESTAMP in Firebird database

我有一个将日期时间字段保存为 DOUBLE 的 Firebird 数据库。我已经创建了一个 ColdFusion 数据源连接,所以我可以远程查询数据。在正确返回其余数据的同时,日期时间字段不可读。我试过使用 CAST 和 CONVERT 无济于事。如何将其转换为时间戳?

存储的数据示例是:43016.988360

你不能只将 DOUBLE PRECISION 转换为 TIMESTAMP,而不是不明确定义你希望它如何映射并自己编写该转换(或者希望有一个现有的 third-party UDF 为你做这件事)。

Firebird 中的 TIMESTAMP 是一个日期 + 时间,表示为一个 8 字节值,其中日期范围是从 1 月 1 日 a.d。到 9999 年 12 月 31 日 a.d。时间范围是 00:00 到 23:59.9999(因此,精度为 100 微秒)。

A DOUBLE PRECISION 通常是存储日期和时间信息的错误类型,并且由于您没有提供应该如何解释双精度值,我们只能说: Firebird 中没有默认方法来执行此操作。

根据下面的评论,该值似乎是一个 ColdFusion 日期值,以双精度形式存储自 1899 年 12 月 30 日以来的天数,另请参见 why is ColdFusion's Epoch Time Dec 30, 1899?。如果确实如此,那么您可以使用以下内容转换为 TIMESTAMP:

select timestamp'1899-12-30 00:00' + 43016.988360 from rdb$database

这将产生值 2017-10-08 23:43:14.304。使用评论中的值 43182.4931754 将产生 2018-03-23 11:50:10.354。这与您的预期相差一毫秒,但这可能是一个 rounding/presentation 问题,例如,如果我改用 43182.49317539,我会得到准确的预期日期。

我强烈建议您使用已知值仔细测试它。