oracle 将SQL中带小数点的17位时间戳转换为日期

l7mqbcuq  于 2023-02-03  发布在  Oracle
关注(0)|答案(4)|浏览(446)

尝试将43439.961377314816转换为date。目前我使用的代码是:

SELECT 
    (timestamp '1970-01-01 00:00:00 GMT' +
     numtodsinterval(WRITETIMESTAMP, 'SECOND')) at time zone 'CST',
    WRITETIMESTAMP
FROM 
    PEETM_FM.ROUTE

但我得到的结果是

01-JAN-70 06.03.59.961377315 AM CST

日期应为:

12/05/2018
6kkfgxo0

6kkfgxo01#

这将生成您想要的日期:

select date '1899-12-30' + 43439.961377314816
from dual;

看起来您使用的是Excel日期或类似的数据。

p8ekf7hl

p8ekf7hl2#

您在查询中遇到了两个问题。首先,您使用了错误的基准时间。正如@GordonLinoff所指出的,Excel日期的基准时间实际上是1900-01-01,而Excel将1900视为闰年。这本身不是Excel中的错误,而是conscious design decision复制了Lotus 1-2-3的(错误的)行为,它 * 确实 * 有这个错误。所以-在Lotus 1-2-3中它是一个错误,但在Excel中它是一个特性。:-)其次,在Excel日期中,整数部分表示自基准日期以来的,小数部分表示一天的分数。然而,在NUMTODSINTERVAL调用中,您将interval_unit参数指定为'SECOND';应该是'DAY'
把这些东西放在一起我们得到

WITH cte AS (SELECT 43439.961377314816 AS WRITETIMESTAMP FROM DUAL)
SELECT 
    (timestamp '1899-12-30 00:00:00 GMT' + numtodsinterval(WRITETIMESTAMP, 'DAY')) at time zone 'CST',
    WRITETIMESTAMP
FROM 
    cte

dbfiddle here
祝你好运。

hxzsmxv2

hxzsmxv23#

在我看来,这是预期行为。43439秒/60/60 = 12小时,从开始时间戳开始计算大约12小时。

SELECT numtodsinterval('43439.961377314816', 'SECOND') as i FROM dual;

I                     
----------------------
+00 12:03:59.961377315

为什么你会认为这会给予你一个日期在2018年?

3b6akqbq

3b6akqbq4#

以下是一个适用于Chrome浏览器的Excel公式。Chrome/Edge:=((单元格/1000000-11644473600)*1000000)/86400000000+日期(1970,1,1)

相关问题