2015-02-25 3 views
0

У меня есть расчет, где я вычитаю два значения даты друг от друга. Я получаю десятичное значение, которое умножаю на 60 (секунд), 60 (минут), 24 (часы). Это значение дает мне количество секунд, которое определенный идентификатор проводит в системе.Преобразование числа в дату

Но я хочу снова получить результат этого вычисления в значении даты, поэтому я могу работать со значениями даты в моей проектной программе.

select to_date((t2.time_event - t1.time_event) * 24 * 60 * 60,'hh24:mm:ss') as "Throughput_Time", count(t1.) as "Payments" 
    from TBL_DUMMYFEED t1 
    join TBL_DUMMYFEED t2 on t1.trax_id = t2.trax_id 
    where t1.event = 'created' and t2.event = 'sent' 
    group by to_date((t2.time_event - t1.time_event) * 24 * 60 * 60,'hh24:mm:ss') 
    order by to_date((t2.time_event - t1.time_event) * 24 * 60 * 60,'hh24:mm:ss'); 

Я застреваю, потому что я не могу все исправить.

+0

Что будет представлять эта дата - как вы сможете использовать ее позже? Вы можете добавить его к произвольной дате, но тогда вы также должны будете использовать всю свою более позднюю логику в эту дату. Если вы хотите, чтобы число было типом даты, возможно, вам нужен интервал? –

+0

Определенный идентификатор проходит через различные состояния события в моей программе. Чтобы вычислить время, которое было в системе, я вычитаю значение даты из первого состояния события из значения даты из последнего состояния события. Я использую Logi Analytics для рисования графиков с данными. Но мой запрос должен возвращать значения даты для использования форматов даты на моей оси. – Lumpi

ответ

1

Это кажется очень громоздким, но если вы действительно должны преобразовать дату типа данных, то вы можете добавить разницу дат в другой произвольной дате:

select date '1970-01-01' + (t2.time_event - t1.time_event) as ... 

Фиксированная дата может быть что угодно, так что я имею просто выбрал эпоху Unix.

Быстрый демо:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'; 

with TBL_DUMMYFEED as (
    select 1 as trax_id, 'created' as event, 
    to_date('2015-02-25 06:49:15', 'YYYY-MM-DD HH24:MI:SS') as time_event 
    from dual 
    union all 
    select 1 as trax_id, 'sent' as event, 
    to_date('2015-02-25 08:13:47', 'YYYY-MM-DD HH24:MI:SS') as time_event 
    from dual 
) 
select t2.time_event - t1.time_event as raw_diff, 
    (t2.time_event - t1.time_event) * 24 * 60 * 60 as diff_in_seconds, 
    numtodsinterval(t2.time_event - t1.time_event, 'DAY') as diff_interval, 
    date '1970-01-01' + (t2.time_event - t1.time_event) as fake_date 
from TBL_DUMMYFEED t1 
join TBL_DUMMYFEED t2 on t1.trax_id = t2.trax_id 
where t1.event = 'created' 
and t2.event = 'sent'; 

    RAW_DIFF DIFF_IN_SECONDS DIFF_INTERVAL FAKE_DATE   
----------- --------------- ------------- ------------------- 
.0587037037   5072 0 1:24:32.0 1970-01-01 01:24:32 

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

+0

Кажется, немного уродливым, но он работает как минимум. Спасибо за помощь – Lumpi

Смежные вопросы