Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Частное двух интервалов  [new]
интервалъ
Guest
Хочу узнать, сколько раз один интервал содержится в другом, например, сколько interval'1'second содержится в interval'1'hour.
По понятным причинам (Арифметика интервалов и других дат) частное interval'1'hour/interval'1'second не работает.
Идеи есть?
3 фев 14, 00:48    [15508048]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
интервалъ
Идеи есть?


Используй EXTRACT:

WITH T AS (
           SELECT  INTERVAL '4' DAY INTERVAL1,
                   INTERVAL '3' HOUR INTERVAL2
             FROM  DUAL
          )
SELECT  (
         (
          (
           EXTRACT(DAY FROM INTERVAL1) * 24 + EXTRACT(HOUR FROM INTERVAL1)
          ) * 60 + EXTRACT(MINUTE FROM INTERVAL1)
         ) * 60 + EXTRACT(SECOND FROM INTERVAL1)
        ) /
        (
         (
          (
           EXTRACT(DAY FROM INTERVAL2) * 24 + EXTRACT(HOUR FROM INTERVAL2)
          ) * 60 + EXTRACT(MINUTE FROM INTERVAL2)
         ) * 60 + EXTRACT(SECOND FROM INTERVAL2)
        ) X
  FROM  t
/

         X
----------
        32

SQL>


Ну и интервалы должны быть одного типа (оба DAY TO SECOND или оба YEAR TO MONTH).

SY.

Сообщение было отредактировано: 3 фев 14, 01:27
3 фев 14, 01:27    [15508102]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
интервалъ
Guest
SY,

Экстракт, блин, наше всё!
Спасибо за мысль, но громоздко донельзя. И быстро, вероятно, тоже.
Всерьёз подумаем о смене способа хранения, хотя, казалось бы, отчего бы и не хранить интервалы именно как интервалы?..
3 фев 14, 06:33    [15508187]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
SELECT ((SYSDATE+INTERVAL1)-SYSDATE) / 
       ((SYSDATE+INTERVAL2)-SYSDATE) 
        
  FROM
    (
        SELECT INTERVAL '4' DAY INTERVAL1,
               INTERVAL '3' HOUR INTERVAL2
          FROM DUAL
    )
3 фев 14, 10:26    [15508622]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ну, только не надо забывать, что вся эта арифметика - арифметика дат (а не интервалов)
3 фев 14, 11:46    [15509121]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
orawish,

я с интервалами не очень
где может слететь?
3 фев 14, 12:01    [15509237]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
andreymx
orawish,

я с интервалами не очень
где может слететь?
интересно, как будет с летним временем
3 фев 14, 12:04    [15509267]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
andreymx
orawish,

я с интервалами не очень
где может слететь?

да не то,чтобы слететь. дата + интервал дает дату.
интервал (тут DS) - это интервал. дата - это дата.
у них и точность разная. например:
SQL> exec DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT','"DD.MM.YYYY HH24:MI:SS"')

Процедура PL/SQL успешно завершена.

SQL> select sysdate d1
  2        ,sysdate + interval '0.49' second
  3                 + interval '0.49' second
  4                 + interval '0.49' second
  5                 + interval '0.49' second as d2
  6        ,sysdate +(interval '0.49' second
  7                 + interval '0.49' second)as d3
  8        ,sysdate +(interval '0.49' second
  9                 + interval '0.49' second
 10                 + interval '0.49' second)as d4
 11    from dual;

D1                  D2                  D3                  D4
------------------- ------------------- ------------------- -------------------
03.02.2014 11:31:36 03.02.2014 11:31:36 03.02.2014 11:31:36 03.02.2014 11:31:37
3 фев 14, 12:43    [15509574]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
интервалъ
Guest
Подумали.

Будем хранить интервал как number в тысячных долях секунды.
Проще при арифметике складывать/вычитать number'ы и numtodsinterval'ить, чем из интервалов извлекать количество в нём тысячных секунды.

Спасибо всем за мысли и показательные примеры.
3 фев 14, 17:12    [15511771]     Ответить | Цитировать Сообщить модератору
 Re: Частное двух интервалов  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
andreymx
SELECT ((SYSDATE+INTERVAL1)-SYSDATE) / 
       ((SYSDATE+INTERVAL2)-SYSDATE) 
        
  FROM
    (
        SELECT INTERVAL '4' DAY INTERVAL1,
               INTERVAL '3' HOUR INTERVAL2
          FROM DUAL
    )


Это не будет правильно работать для DAY TO SECOND интервалов c дробным числом секунд а для YEAR TO MONTH результат будет зависеть от SYSDATE и вообще может вылететь в exception:

SCOTT@pdborcl12 > select date '2014-01-31' + INTERVAL '3' MONTH from dual;
select date '2014-01-31' + INTERVAL '3' MONTH from dual
                         *
ERROR at line 1:
ORA-01839: date not valid for month specified


SCOTT@pdborcl12 > 


SY.

Сообщение было отредактировано: 3 фев 14, 18:03
3 фев 14, 18:02    [15512097]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить