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

时间:2018-12-08 18:42:12

标签: sql oracle timestamp

尝试将43439.961377314816转换为日期。目前,我正在使用以下代码:

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

3 个答案:

答案 0 :(得分:2)

这将产生您想要的日期:

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

您似乎正在使用Excel日期或类似日期。

答案 1 :(得分:1)

查询中有两个问题。首先,您使用了错误的基准时间。如@GordonLinoff所指出的,Excel日期的基本时间实际上是1900-01-01,Excel将1900视为a年。从本质上讲,这不是Excel中的错误,而是一个conscious design decision,用于复制Lotus 1-2-3的(越野车)行为,该行为 did 具有此错误。所以-在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

好运。

答案 2 :(得分:0)

这对我来说似乎是预期的行为。 43439秒/ 60/60 = 12小时,从开始时间戳起大约12小时。

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

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

您为什么认为这会给您2018年的约会?