powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложение реального рабочего времени
16 сообщений из 16, страница 1 из 1
Сложение реального рабочего времени
    #38948606
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые участники форума, у меня следующий вопрос,

Условно - есть таблица с определенными в ней столбцами
system_number varchar2(10) not null,
thread_number number(1) not null,
start_date date not null,
end_date date null

Постараюсь внятно объяснить, что тут хранится... Есть различные системы, пускай это будут система_1, система_2, система_3, система_4, каждая система может работать многопоточно. У каждого потока есть дата/время начала и окончания. Соответственно, в случае многопоточной работы системы временные интервалы пересекаются. Требуется для каждой системы в разрезе дня получить суммарное полезное время работы в секундах

Грубый пример. Система_1 работала 28 апреля в двух потоках, один отработал с 11:00 до 13:00, второй с 12:00 до 14:00. если предположить, что в течение 28 апреля система_1 больше не работала, то для 28 апреля результат будет 3 часа, но не 4, т.к. периоды с 12 до 13 часов пересекаются. Понятно, что потоков может быть больше и интервалов в течение дня могут быть десятки и даже сотни.

я думал-думал, как это сделать через SQL, в итоге плюнул и реализовал все хранимой функцией, но может кто подскажет, как это сделать через SQL? и можно ли?

Спасибо!
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38948623
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38948629
vaneque,

слить пересекающиеся периоды в рамках одной системы в один "мегапериод" и посчитать сумму длин непересекающихся "мегапериодов"
пример слияния периодов, с "картинками"
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38948640
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

Спасибо, попробую
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38948655
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхvaneque,

слить пересекающиеся периоды в рамках одной системы в один "мегапериод" и посчитать сумму длин непересекающихся "мегапериодов"
пример слияния периодов, с "картинками"
я не вникал, но судя по картинке время интервалов там не складывается, а ищется просто непрерывный интервал. ТС по моему хочет посчитать сумму всех тредов.
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38948662
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не-не, все честно. в рамках одной системы могут быть пересечения как раз из-за того, что много тредов работает, мне нужно как раз эти треды наложить друг на друга и получить реально рабочее время, неважно, какое количество пересечений в тредах в рамках конкретной системы было

roadsterДобрый Э - Эхvaneque,

слить пересекающиеся периоды в рамках одной системы в один "мегапериод" и посчитать сумму длин непересекающихся "мегапериодов"
пример слияния периодов, с "картинками"
я не вникал, но судя по картинке время интервалов там не складывается, а ищется просто непрерывный интервал. ТС по моему хочет посчитать сумму всех тредов.
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38948710
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vanequeНе-не, все честно. в рамках одной системы могут быть пересечения как раз из-за того, что много тредов работает, мне нужно как раз эти треды наложить друг на друга и получить реально рабочее время, неважно, какое количество пересечений в тредах в рамках конкретной системы былозначит я не понял.
думал считать что-то вроде человеко-часов надо.
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38965497
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

спасибо огромное! :) переписал хранимку с циклом и кучей операций присваивания на иерархические запросы и запросы с оконными функциями, адаптировав твой пример под свои нужды, стало работать в 300 раз быстрее. профит! :)
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38965633
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vanequeДобрый Э - Эх,

спасибо огромное! :) переписал хранимку с циклом и кучей операций присваивания на иерархические запросы и запросы с оконными функциями, адаптировав твой пример под свои нужды, стало работать в 300 раз быстрее. профит! :)
імхо, время на pl/sql должно быть сравнимо, а то и быстрее

.....
stax
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38965651
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

на самом деле было сделано через одно место... у меня было 2 параметра - start_date и end_date (без времени), я в рамках процедуры организовал loop по дням и для каждого дня делал еще один loop, все эти операции по поиску нахождения пограничных точек диапазонов работы систем проводил с помощью ветвления и сохранения промежуточных значений в переменные, затем складывал разницы между вычисленными диапазонами времени, после окончания вложенного loop'а делал сохранение во временную таблицу, затем начиналась обработка следующего дня, соответственно кол-во запросов было очень большим. сейчас вообще loop'ов нет, сделал WITH, к которому left join'ом прикрепляю данные(системы теоретически могут не каждый день работать, но если не работали - надо выдать, что они работали 0 секунд, это уже дальше при суммировании разниц диапазонов полученных)

Код: plsql
1.
2.
3.
4.
5.
with dates as
(
  select start_oper_date_param+rownum-1 oper_date from dual
  connect by level<=end_oper_date_param-start_oper_date_param+1
)



во втором loop'е тоже пропала необходимость, т.к. заюзал оконную функцию. реальная прикладная задача намного сложнее, чем я привел в примере, но мне надо было только принцип понять - можно ли это сделать.
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38965742
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vanequestax..,
реальная прикладная задача намного сложнее, чем я привел в примере, но мне надо было только принцип понять - можно ли это сделать.
тем более, pl/sql должен виігривать
тупо обьеденить пересекающиеся и "намного сложнее"

.....
stax
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38965833
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ммм... раньше процедура работала около 4,5 с, теперь работает примерно 0.015 с. а результат абсолютно одинаковый (сохраняется в GTT). параметризованная процедура осталась, но только в качестве обертки над транзакцией, в которой от и до лежат связанные SQL запросы, работающие с присланными параметрами, необходимые для моей прикладной задачи, а циклы(в том числе вложенные) и большое количество логики исчезли. по-моему логично, что стало работать быстрее, нет? я сам писал кучу кода и проводил много code review и никогда не пропускал совершенно ненужный pl/sql, когда задачу можно решить обычным sql, эту мысль я усвоил еще давно, читая Тома Кайта. мне просто нужно было быстро решить задачу, т.к. были сроки, поэтому сделал как смог. а вообще на моей практике не припомню, чтобы обработка записей через loop'ы была быстрее, чем через SQL запросы...

stax..vanequestax..,
реальная прикладная задача намного сложнее, чем я привел в примере, но мне надо было только принцип понять - можно ли это сделать.
тем более, pl/sql должен виігривать
тупо обьеденить пересекающиеся и "намного сложнее"

.....
stax
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38966737
taf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
taf
Гость
vaneque...
Грубый пример. Система_1 работала 28 апреля в двух потоках, один отработал с 11:00 до 13:00, второй с 12:00 до 14:00. если предположить, что в течение 28 апреля система_1 больше не работала, то для 28 апреля результат будет 3 часа, но не 4, т.к. периоды с 12 до 13 часов пересекаются. Понятно, что потоков может быть больше и интервалов в течение дня могут быть десятки и даже сотни.

я думал-думал, как это сделать через SQL, в итоге плюнул и реализовал все хранимой функцией, но может кто подскажет, как это сделать через SQL? и можно ли?

Спасибо!

Как вариант решения примера:
SQL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
select max(s1_h1) + max(s1_h2) + max(s1_h3) + max(s1_h4) + max(s1_h5) + max(s1_h6) + max(s1_h7) + max(s1_h8) + max(s1_h9) + 
         max(s1_h10) + max(s1_h11) + max(s1_h12) + max(s1_h13) + max(s1_h14) + max(s1_h15) + max(s1_h16) + max(s1_h17) + 
         max(s1_h18) + max(s1_h19) + max(s1_h20) + max(s1_h21) + max(s1_h22) + max(s1_h23) + max(s1_h24) hours_of_work_system_1
         /*, max(s2_h1) hours_of_work_system_2 ...*/
from  (select system_number, 
          case when system_number = 'система_1' and 
                          start_date <= to_date('28.04.2015 00', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 00', 'DD.MM.YYYY hh24') 
                   then 1 
                    else 0 
          end s1_h1, 
          case when system_number = 'система_1' and  
                          start_date <= to_date('28.04.2015 01', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 01', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0 
          end s1_h2, 
          case when system_number = 'система_1' and   
                          start_date <= to_date('28.04.2015 02', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 02', 'DD.MM.YYYY hh24')  
                   then 1  
                    else 0  
          end s1_h3, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 03', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 03', 'DD.MM.YYYY hh24')  
                   then 1  
                    else 0  
          end s1_h4, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 04', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 04', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h5, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 05', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 05', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h6, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 06', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 06', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h7, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 07', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 07', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h8, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 08', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 08', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h9, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 09', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 09', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h10, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 10', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 10', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h11, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 11', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 11', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h12, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 12', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 12', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h13, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 13', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 13', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h14, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 14', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 14', 'DD.MM.YYYY hh24') 
                   then 1 
                    else 0  
          end s1_h15, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 15', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 15', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h16, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 16', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 16', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h17, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 17', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 17', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h18, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 18', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 18', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h19, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 19', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 19', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h20, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 20', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 20', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h21, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 21', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 21', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h22, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 22', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 22', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h23, 
          case when system_number = 'система_1' and    
                          start_date <= to_date('28.04.2015 23', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 23', 'DD.MM.YYYY hh24') 
                   then 1  
                    else 0  
          end s1_h24
          /*, case when system_number = 'система_2' and    
                          start_date <= to_date('28.04.2015 00', 'DD.MM.YYYY hh24') and 
                          end_date > to_date('28.04.2015 00', 'DD.MM.YYYY hh24') 
                   then 1 
                    else 0  
          end s2_h1 ...*/
          from (select 'система_1' system_number, 1 thread_number, to_date('28.04.2015 11', 'DD.MM.YYYY hh24') start_date, 
                        to_date('28.04.2015 13', 'DD.MM.YYYY hh24') end_date 
                    from dual 
                  UNION ALL
                  select 'система_1', 2,  to_date('28.04.2015 12', 'DD.MM.YYYY hh24'), to_date('28.04.2015 14', 'DD.MM.YYYY hh24') 
                    from dual 
                    /*UNION ALL
                    select 'система_2', 2, to_date('28.04.2015 00', 'DD.MM.YYYY hh24'), to_date('28.04.2015 01', 'DD.MM.YYYY hh24') from dual ...*/
                    )
);



Суть - разбивка анализируемого временного интервала на части с последующей проверкой на работу системы в каждой части временного интервала. Затем применение функции max для вынесения конечного решения о том, работала ли система в данной части временной интервал. После чего суммируются части временных интервалов для соответствующих систем.

Если временной интервал разбить не на часы а на минуты или секунды то получится огромная конструкция SQL-запроса...
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #38966754
vaneque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
taf,

спасибо за уделенное время, но у меня там не то, что секунды, у меня вообще там таймстемпы и конструкция подобная для моей задачи будет мягко говоря неприемлема. В топике я привел пример просто для простоты, чтобы было проще понять что мне нужно. Вариант форумчанина "добрый Э-Эх" для моей задачи прекрасно подошел - оконным функциям все равно, какая там грануляция данных, SQL-конструкция краткая, гибкая, хотя и немного сложноватая для восприятия.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сложение реального рабочего времени
    #39537966
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vaneque,

похожее
И вновь временные интервалы

.....
stax
...
Рейтинг: 0 / 0
Сложение реального рабочего времени
    #39537967
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

не туда

.....
stax
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложение реального рабочего времени
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]