В: Как получить дату со временем (часы, минуты, секунды) из 19-значного числа в Oracle

Я хочу получить дату и время из 19-значного числа в Oracle и не смог найти решения для этих больших чисел. Время должно быть в формате HH24:MI:SS. Я могу получить дату, но не могу получить время.

** Примеры чисел для получения даты и времени:

1190205161950369000 , 1190206092859146000 , 1181230172734928000 , 1181108121251823000

Для этих чисел выше я добавил к ним дополнительное значение «190000000000000000000» и подстроку первых 8 цифр из общего значения, чтобы первые 8 цифр давали мне дату (ггггммдд).

Например:

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

Следовательно, дата 05-02-2019 (ДД-ММ-ГГГГ). Но чтобы получить время, даже если я увеличу длину подстроки с 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;

person Dhanesh Agrawal    schedule 06.02.2019    source источник


Ответы (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
person Gordon Linoff    schedule 06.02.2019
comment
Спасибо. Второй запрос, преобразующий его в метку времени, работает, но секунды содержат слишком много дробей. Когда я запускаю этот запрос, вывод: 05-02-19 16:19:50,000000000 - person Dhanesh Agrawal; 06.02.2019
comment
@DhaneshAgrawal . . . Время есть, его просто не видно. - person Gordon Linoff; 06.02.2019

Похоже, что часть времени содержит доли секунды, состоящие из шести цифр. Вы можете преобразовать его так:

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
person Salman A    schedule 06.02.2019
comment
Спасибо Салман. Да, кажется, есть микросекунды, которые я не хочу показывать :( - person Dhanesh Agrawal; 06.02.2019
comment
Вы можете использовать ответ Гордона (1-й). Дата будет содержать часы, минуты и секунды. При необходимости снова вызовите to_char, чтобы отформатировать дату по желанию (to_char(to_date(substr(to_char..., 'YYYY-MM-DD HH24:MI:SS')) - person Salman A; 06.02.2019