代码之家  ›  专栏  ›  技术社区  ›  Dhanesh Agrawal

Q: 如何从Oracle中的19位数字中检索日期和时间(小时、分钟、秒)

  •  1
  • Dhanesh Agrawal  · 技术社区  · 7 年前

    我想从甲骨文的一个19位数字中获取日期和时间,但找不到任何解决这个大数字的方法。时间格式应为HH24:MI:SS。我可以检索日期,但无法获得时间。

    **获取日期和时间的示例数字:

    1190205161950369000 , 1190206092859146000 , 1181230172734928000 , 1181108121251823000
    

    对于上面的这些数字,我给它们加上一个加法值“190000000000000000000”,并将总值的前8个数字串起来,这样前8个数字就是日期(yyyymmdd)。

    例如:

    SUBSTR(1190205161950369000+19000000000000000000,0,8)=20190205

    因此,日期为2019年2月5日(日-月-年)。但是为了得到时间,即使我把子串的长度从8增加到14或18,我仍然只得到日期而不是时间。

    使用的SQL查询:

    Select to_date(SUBSTR(1190205161950369000+19000000000000000000,0,8),
        'YYYYMMDD HH24:MI:SS') as truedate
    from dual;
    

    结果:

    TRUEDATE
    ---------
    05-02-2019
    

    我也试过了,但没用:

    Select to_date(SUBSTR(1190205161950369000+19000000000000000000,0,14),
        'YYYYMMDD HH24:MI:SS.SSSSS') as truedate
    from dual;
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Gordon Linoff    7 年前

    首先,要转换值,这似乎有效:

    select to_date(substr(to_char(1190205161950369000 + 19000000000000000000), 1, 14), 'YYYYMMDDHH24MISS')
    from dual
    

    默认情况下,日期不显示时间。可以转换为字符串,也可以转换为时间戳:

    select to_timestamp(substr(to_char(1190205161950369000 + 19000000000000000000), 1, 14), 'YYYYMMDDHH24MISS')
    from dual;
    

    通过转换 date 到a timestamp :

    select to_timestamp(to_date(substr(to_char(1190205161950369000 + 19000000000000000000), 1, 14), 'YYYYMMDDHH24MISS'))
    from dual
    
        2
  •  2
  •   Salman Arshad    7 年前

    时间部分似乎包含由六位数组成的分数秒。可以这样转换:

    WITH tests AS (
       SELECT 1190205161950369000 AS n FROM DUAL UNION
       SELECT 1190206092859146000 FROM DUAL UNION 
       SELECT 1181230172734928000 FROM DUAL UNION 
       SELECT 1181108121251823000 FROM DUAL
    )
    SELECT n, TO_TIMESTAMP(TO_CHAR(n + 19000000000000000000), 'YYYYMMDDHH24MISSFF')
    FROM tests