Преобразование переменной NUMBER в метку даты и времени

Я использую следующее, где я конвертирую переменную NUMBER в штамп Datetime.

to_char(
 (to_timestamp('01-JAN-1970 00:00:00','DD-MON-YYYY HH24:MI:SS') + 
 (END_SAMPLE_TS_5MIN_MS/(1000*60*60*24)),'DD-MON-YYYY HH24:MI:SS')

Но я заметил, что результат, полученный сверху, отстает на 1 секунду от фактического значения. Скажем, например, если END_SAMPLE_TS_5MIN_MS=1388984699999.Вместо показа: 06Jan2014 05:04:59Это показывает как 06Jan2014 05:05:00Миллисекунды округляются до ближайшей секунды. Пожалуйста помоги!

2 ответа

Вы можете использовать numtodsinterval, что-то вроде:

select to_timestamp('01-JAN-1970 00:00:00.000','DD-MON-YYYY HH24:MI:SS.FF3')  +
    numtodsinterval(1388984699.999, 'SECOND')
    from dual;

Выход:

1/6/2014 5:04:59.999000000 AM

надеюсь, это поможет

Если вы не заинтересованы в использовании миллисекунд для округления, вы можете эффективно взять "пол" своей эпохи с подстрокой:

select to_char((to_timestamp('01-JAN-1970 00:00:00','DD-MON-YYYY HH24:MI:SS')+(substr(1388984699999,1,length(1388984699999)-3)/(60*60*24))),'DD-MON-YYYY HH24:MI:SS') from dual

Мы на самом деле просто берем подстроку нашей строки минус последние 3 цифры (миллисекунды в этом формате метки времени unix) и затем добавляем ее в эпоху, чтобы получить ваше время.

Другие вопросы по тегам