问:如何从Oracle中的19位数字中检索带有时间(小时,分钟,秒)的日期

时间:2019-02-06 12:06:34

标签: sql oracle oracle11g to-date

我想从Oracle中的19位数字中获取日期和时间,但是找不到用于此大数字的任何解决方案。时间应采用HH24:MI:SS格式。我可以检索日期,但无法获取时间。

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

1190205161950369000 , 1190206092859146000 , 1181230172734928000 , 1181108121251823000

对于上面的这些数字,我在它们的总和前加上了一个附加值“ 19000000000000000000”,并从前8个子字符串中扣除,以便前8个数字为我提供日期(yyyymmdd)。

例如:

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

因此,日期为05-02-2019(DD-MM-YYYY)。但是要获得时间,即使我将子串的长度从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 个答案:

答案 0 :(得分:2)

首先,要转换值,这似乎可行:

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转换为timestamp,您可以看到时间分量在那里:

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

答案 1 :(得分:2)

好像时间部分包含由六位数字组成的小数秒。您可以像这样转换它:

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