Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Конвертировать интервал в число  [new]
Reflector
Member

Откуда:
Сообщений: 65
Добрый вечер.
Подскажите, пожалуйста, есть ли функция, обратная функции numtodsinterval.
То есть та, которая конвертирует interval_to_second в number.
Пример
Есть 2 даты
select (to_timestamp('18.12.17 20:37:44.140000', 'dd.mm.yy hh24:mi:ss.ff') -to_timestamp('18.12.17 20:26:57', 'dd.mm.yy hh24:mi:ss.ff')) from dual

На выходе получу
+000000000 00:10:47

Их разность равна
646802
.
Возможно, миллисекунды, затрудняюсь сказать.
Не нашел каких-то похожих вариантов конвертирования.
Пробовал через extract, но скорее всего, где-то ошибся.
select (sysdate +
       (to_timestamp('18.12.17 20:37:44.140000', 'dd.mm.yy hh24:mi:ss.ff') -
       to_timestamp('18.12.17 20:26:57', 'dd.mm.yy hh24:mi:ss.ff')) -
       sysdate) * 86400 +
       mod(extract(second from(to_timestamp('18.12.17 20:37:44.140000',
                                     'dd.mm.yy hh24:mi:ss.ff') -
                        to_timestamp('18.12.17 20:26:57',
                                     'dd.mm.yy hh24:mi:ss.ff'))),
           1)
from dual

Help plz!
19 дек 17, 20:07    [21046839]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать интервал в число  [new]
Reflector
Member

Откуда:
Сообщений: 65
Прошу прощения, вторая дата
to_timestamp('18.12.17 20:26:57.338000',
                                     'dd.mm.yy hh24:mi:ss.ff')
19 дек 17, 20:20    [21046867]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать интервал в число  [new]
Reflector
Member

Откуда:
Сообщений: 65
При умжножении результат почти сходится, но все же
select ((sysdate +
       (to_timestamp('18.12.17 20:37:44.140000', 'dd.mm.yy hh24:mi:ss.ff') -
       to_timestamp('18.12.17 20:26:57', 'dd.mm.yy hh24:mi:ss.ff')) -
       sysdate) * 86400 +
       mod(extract(second from(to_timestamp('18.12.17 20:37:44.140000',
                                     'dd.mm.yy hh24:mi:ss.ff') -
                        to_timestamp('18.12.17 20:26:57.338000',
                                     'dd.mm.yy hh24:mi:ss.ff'))),
           1))*1000
from dual


647802

Отличается всего-то на 1000:)
19 дек 17, 20:26    [21046878]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать интервал в число  [new]
Reflector
Member

Откуда:
Сообщений: 65
Все, разобрался
select ((sysdate +
       (to_timestamp('18.12.17 20:37:44.140000', 'dd.mm.yy hh24:mi:ss.ff') -
       to_timestamp('18.12.17 20:26:57.338000', 'dd.mm.yy hh24:mi:ss.ff')) -
       sysdate) * 86400 +
       mod(extract(second from(to_timestamp('18.12.17 20:37:44.140000',
                                     'dd.mm.yy hh24:mi:ss.ff') -
                        to_timestamp('18.12.17 20:26:57.338000',
                                     'dd.mm.yy hh24:mi:ss.ff'))),
           1))*1000
from dual

Вот конечный вариант. Злую шутку сыграл отсутствующий после точки штамп:) Всем спасибо.
19 дек 17, 20:30    [21046888]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать интервал в число  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18336
with t as (select to_timestamp('18.12.17 20:26:57.338000', 'dd.mm.yy hh24:mi:ss.ff') ts1
                , to_timestamp('18.12.17 20:37:44.140000', 'dd.mm.yy hh24:mi:ss.ff') ts2
            from dual
        union all select systimestamp-1/3, systimestamp from dual
        union all select systimestamp-1/3, systimestamp+10 from dual
            )
select ts2-ts1 the_interval
       , ((sysdate + (ts2 - ts1) - sysdate) * 86400 
        + mod(extract(second from(ts2 -ts1)), 1))*1000 author_way
       , 1000*(extract(day from(ts2 -ts1))*86400
       + extract(hour from(ts2 -ts1))*3600
       + extract(minute from(ts2 -ts1))*60
       + extract(second from(ts2 -ts1))) extract_way
       , (to_number(to_char(ts2,'J'))-to_number(to_char(ts1,'J')))*86400*1000
       + (to_number(to_char(ts2,'SSSSSFF6'))-to_number(to_char(ts1,'SSSSSFF6')))/1000
       string_way
--       , (sysdate + (ts2 - ts1)*86400 - sysdate) trick_way -- fail on long intervals
from t
19 дек 17, 21:36    [21047007]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать интервал в число  [new]
Elic
Member

Откуда:
Сообщений: 29976
Reflector
есть ли функция, обратная функции numtodsinterval.
Делов-то, чтоб ей быть.
+
---------
function Interval2Sec(aInterval dsinterval_unconstrained) return number
is
begin
  return extract(day    from (aInterval))*24*60*60
       + extract(hour   from (aInterval))   *60*60
       + extract(minute from (aInterval))      *60
       + extract(second from (aInterval))
  ;
end Interval2Sec;
20 дек 17, 07:36    [21047485]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить