我有一个Firebird数据库,将datetime字段另存为DOUBLE。我已经创建了ColdFusion数据源连接,因此可以远程查询数据。当其余数据正确返回时,datetime字段不可读。我尝试使用CAST和CONVERT无济于事。如何将其转换为时间戳?
存储的数据的示例是:43016.988360
最佳答案
您不能只将DOUBLE PRECISION
转换为TIMESTAMP
,就必须明确定义您希望的映射方式并自己编写转换(或者希望现有的第三方UDF可以为您完成此操作)。
Firebird中的TIMESTAMP
是日期+时间,表示为8个字节的值,其中日期范围是从1月1日1d开始。至9999年12月31日时间范围是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
,则会得到确切的期望日期。我强烈建议您使用已知值对此进行仔细测试。
关于sql - 在Firebird数据库中将DOUBLE列转换为TIMESTAMP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49536438/