2016-05-18 10 views
0

Контекст заключается в том, что в нашем продукте есть существующее приложение, которое генерирует и отправляет номер EPOCH в существующую процедуру оракула & наоборот. Она работает в этой процедуре, используя что-то вроде этогоoracle convert unix epoch time to date

SELECT UTC_TO_DATE (1463533832) FROM DUAL 
SELECT date_to_utc(creation_date) FROM mytable 

Когда я попробовал эти вопросы он работает для меня, а с 10г сервера Oracle (и Oracle SQL Developer 4.x, если это имеет значение).

В существующей процедуре требование заключалось в том, чтобы сохранить значение в качестве самой даты (компонент времени был неактуальным), однако в новом требовании мне необходимо преобразовать значение unix EPOCH в datetime (на уровне часов/мин/секунд или лучше в определенном формате, таком как dd-MMM-yyyy hh: mm: ss) в запросе оракула. Странно, я не могу найти документацию вокруг UTC_TO_DATE и DATE_TO_UTC функций с Google. Я просмотрел все разные вопросы о stackoverflow, но большинство из них относятся к языкам программирования, таким как php, java и т. Д.

Нижняя строка, как конвертировать EPOCH на этот уровень времени, используя эти функции (или любые другие функции) в запросе Oracle? Кроме того, эти функции, которые я имею в виду, могут быть обычными или конкретными, поскольку я не вижу никакой документации или ссылки на это.

+0

Это не стандартные функции, они являются частью вашего приложения. Вам необходимо найти источник для них (в исходном управлении или в user_source или all_source, если этого не существует). Но хотите ли вы их модифицировать, иметь новые версии, включающие время или автономное преобразование? Вам также необходимо проверить, соответствуют ли даты, в которые вы проходите/возвращаетесь, также UTC или представляете другой регион - ваши функции могут корректировать их. –

+0

@AlexPoole Спасибо за предложение. Мне показалось, что они могут быть обычными, но я должен признать, что я не понимал, что они могут быть обычными в моей кодовой базе. Так что да, я нашел свое определение в контроле источника, и у них есть внутренняя работа, почти такая же, как то, что разделил tbone ниже. –

+0

Изменяют ли они дату на другой часовой пояс или они предполагают, что даты также обозначают UTC? И учитывая ваш комментарий к ответу tbone, вы уверены, что они еще не установили компоненты времени, и вы просто не видели их? –

ответ

5

Для преобразования миллисекунд эпохи (предположим, что эпоха является 1 января 1970):

select to_date('19700101', 'YYYYMMDD') + (1/24/60/60/1000) * 1322629200000 
from dual; 

11/30/2011 5:00:00 AM

Чтобы преобразовать эту дату обратно в миллисекундах:

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60 * 1000 
from dual; 

Если его секунды вместо миллисекунд, просто опускаем-е e 1000 часть уравнения:

select to_date('19700101', 'YYYYMMDD') + (1/24/60/60) * 1322629200 
from dual; 

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60 
from dual; 

Надеюсь, что это поможет.

+2

Обратите внимание, что это дает правильные результаты, только если ваш местный часовой пояс также UTC. –

+0

Спасибо @tbone, это довольно близко .. Единственный комментарий, который у меня есть, это то, что если я сделаю ваш запрос и даже этот - выберите to_date ('19700101', 'YYYYMMDD HH24: MI: SS') + (1/24/60/60) * 1463533832 от двойного; Все еще в окне вывода разработчика Sql я вижу это - TO_DATE ('19700101', 'YYYYMMDDH ----------------------------- 18-MAY-16 Любые мысли, почему бы мне не увидеть час, минуты и секунды –

+0

@SubhashDike - именно так ваш клиент отображает дату, измените свой NLS_DATE_FORMAT или (желательно) используйте 'to_char()', чтобы указать формат, с маской, как «YYYY-MM-DD HH24: MI: SS». –

2

Другим вариантом является использование типа интервала:

SELECT TO_TIMESTAMP('1970-01-01 00:00:00.0' 
        ,'YYYY-MM-DD HH24:MI:SS.FF' 
     ) + NUMTODSINTERVAL(1493963084212/1000, 'SECOND') 
FROM dual; 

Это имеет то преимущество, что миллисекунды не будут резать.

0

Здесь он предназначен как для UTC/GMT, так и для EST;

GMT select (to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
    (1519232926891)/1000/60/60/24) from dual; 

EST select new_time(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
    (1519232926891)/1000/60/60/24, 'GMT', 'EST') from dual;