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

Откуда:
Сообщений: 2
Есть некая таблица svod_table_time_obs, DATESTAMP время возврата катера на базу, PLACE_REQUEST - место пребывания, 0-на базе, 1 - ушел с базы
DATESTAMP PLACE_REQUEST
04.02.2013 10:10:04 0
04.02.2013 10:17:24 1
04.02.2013 10:21:04 0
04.02.2013 10:27:20 1
04.02.2013 10:46:02 0
04.02.2013 10:54:12 1

Нужно выслить разницу дат нахождения на базе, а именно 2 и 1, 4 и 3, 6 и 5. Делаю вот таким образом,
DT date;
DT1 date;
DTSUM := 0;
for cur in (select * from svod_table_time_obs c) loop
DTSUM1 := 0;
IF (cur.place_request = 0) then
DT := cur.datestamp;
ELSE
IF (cur.place_request = 1) then
DT1 := cur.datestamp;
else
DT1 := sysdate;
end if;
end if;
DTSUM := DT1 - DT;
DTSUM1 := DTSUM + DTSUM1;
end loop;
insert into svod_itog values (1, DTSUM1);
commit;
Но в таблицу svod_itog пишет естественно разницу последних значений,6 и 5.Вроде как и нашел ошибку,в куске неправильно считаю
DTSUM := DT1 - DT;
DTSUM1 := DTSUM + DTSUM1;
Но никак не соображу как правильно сделать, ибо уровень опыта начальный.
Подскажите, плиз.
5 фев 13, 17:00    [13879234]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
Corner
Member

Откуда:
Сообщений: 1270
with t(DATESTAMP,
PLACE_REQUEST) as
 (select to_date('04.02.2013 10:10:04', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:17:24', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual
  union
  select to_date('04.02.2013 10:21:04', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:27:20', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual
  union
  select to_date('04.02.2013 10:46:02', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:54:12', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual)
select part, max(DATESTAMP) max_d, min(DATESTAMP) min_d
  from (select DATESTAMP,
               PLACE_REQUEST,
               (sum(PLACE_REQUEST) over(order by DATESTAMP)) - PLACE_REQUEST part
          from t)
 group by part
5 фев 13, 17:17    [13879402]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
Добрый Э - Эх
Guest
Обязательно курсоры? Аналитика с группировкой не пойдет? Так-то нужно курить в сторону LEAD/LAG и их применение в start_of_group-методах решения задач...
5 фев 13, 17:19    [13879411]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
Добрый Э - Эх
Guest
Corner,

осталось надеяться, что катер не уплывал более одного раза подряд, или не приплывал два и более раза к ряду
5 фев 13, 17:21    [13879427]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
kototsin
Member

Откуда:
Сообщений: 4
возможно:
попробуй перенести вот эту строчку: " insert into svod_itog values (1, DTSUM1);" и поставь ее перед "end loop;"
5 фев 13, 17:25    [13879476]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
Maxot
Member

Откуда:
Сообщений: 2
kototsin,

попробовал.
записывается, собственно, 6 строк разницы в таблицу, причем по некоторым записям разница отрицательная :)
по ходу, дальше что то не то рассчитывает :)
5 фев 13, 17:33    [13879568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
Corner
Member

Откуда:
Сообщений: 1270
Добрый Э - Эх
Corner,

осталось надеяться, что катер не уплывал более одного раза подряд, или не приплывал два и более раза к ряду


with t(DATESTAMP,
PLACE_REQUEST) as
 (select to_date('04.02.2013 10:10:04', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:17:24', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual
  union
  select to_date('04.02.2013 10:21:04', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:24:04', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:27:20', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual
  union
  select to_date('04.02.2013 10:28:20', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual
  union
  select to_date('04.02.2013 10:46:02', 'DD.MM.YYYY HH24:MI:SS'), 0
    from dual
  union
  select to_date('04.02.2013 10:54:12', 'DD.MM.YYYY HH24:MI:SS'), 1
    from dual)
select part, max(DATESTAMP) max_d, min(DATESTAMP) min_d
  from (select DATESTAMP,
               PLACE_REQUEST,
               sum(ch) over(order by DATESTAMP) part
          from (select DATESTAMP,
                       PLACE_REQUEST,
                       case PLACE_REQUEST -
                        nvl(lag(PLACE_REQUEST) over(order by DATESTAMP),
                            PLACE_REQUEST)
                         when -1 then
                          1
                         else
                          0
                       end ch
                  from t))
 group by part
5 фев 13, 17:41    [13879658]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз, как в курсоре посчитать сумме разниц дат  [new]
kototsin
Member

Откуда:
Сообщений: 4
Maxot
kototsin,

попробовал.
записывается, собственно, 6 строк разницы в таблицу, причем по некоторым записям разница отрицательная :)
по ходу, дальше что то не то рассчитывает :)


бью перед всеми челом о земь, не все буквы внимательно читал. мой вариант просто решает проблему записи в таблицу всех строк из цикла, а не последней, думаю более подробно тут описано уже старожилами или же более знающими людьми :)
5 фев 13, 17:49    [13879706]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить