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

时间:2018-03-28 13:53:55

标签: sql coldfusion firebird

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

存储的数据示例为:43016.988360

1 个答案:

答案 0 :(得分:5)

您无法将DOUBLE PRECISION转换为TIMESTAMP,而不是明确定义您希望如何映射并自行编写转换(或希望存在现有的第三方UDF)这样做对你来说)。

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

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。这比您的预期减少了一毫秒,但这可能是一个舍入/呈现问题,例如,如果我使用43182.49317539,我会得到确切的预期日期。

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