powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисление среднего значения за час
32 сообщений из 32, показаны все 2 страниц
Вычисление среднего значения за час
    #39620901
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите пожалуйста, как сделать процедуру в базе, которая возвращает среднее значение работы сотрудника за час?
Имеется таблица вида:

USER_ID T_START T_STOPСотрудник 1 26.03.2018 11:24:11 26.03.2018 11:27:48Сотрудник 1 26.03.2018 11:27:53 26.03.2018 11:31:54Сотрудник 1 26.03.2018 11:31:54 26.03.2018 11:42:50Сотрудник 1 26.03.2018 12:59:00 26.03.2018 13:24:00

Где T_START - начало работы, T_STOP соответственно конец.

В итоге нужно получить таблицу следующего вида:

USER_ID 10:00-11:00 11:00-12:00 12:00-13:00 13:00-14:00 и так до 18:00Сотрудник1 0 ~18/60 1/60 24/60

Модератор: Осваиваем тег CSV
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621197
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

должно натолкнуть на мысль
Перечисления в CASE
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621236
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mkr,
уже натолкнули, но я не пойму как код работает

Код: sql
1.
2.
3.
4.
5.
6.
    CASE WHEN EXTRACT(HOUR FROM T_START)<=12 and EXTRACT(HOUR FROM T_STOP)>=12
         THEN CASE WHEN EXTRACT(HOUR FROM T_START)<12 and EXTRACT(HOUR FROM T_STOP)>12 THEN CAST('13:00:00' AS TIME)-CAST('12:00:00' AS TIME)
                   WHEN EXTRACT(HOUR FROM T_START)<12 THEN CAST(T_STOP AS TIME)-CAST('12:00:00' AS TIME)
                   WHEN EXTRACT(HOUR FROM T_STOP)>12 THEN CAST('13:00:00' AS TIME)-CAST(T_START AS TIME)
                   ELSE CAST(T_STOP AS TIME)-CAST(T_START AS TIME) END
         ELSE 0 END AS Between12and13,
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621269
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

для каждого столбца делай отдельные условия 10:00-11:00, 11:00-12:00...
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621275
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mkr,

Пробовал, не выходит. У меня CASE на каждый час, должна получиться одна строка, а в итоге 5 строк..
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621287
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordуже натолкнули
Код можно и сократить на if-ах плюс проинициализировать переменные по часам, что скажется на скорости и читабельности. Обернуть процедурой.

Плюсом не обрабатывается ситуация, когда работник задержался чуток (до 00:01 следующего дня, к примеру).
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621292
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Можно пример?
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621296
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordМожно пример?Пример мною описанного решения будет законченным.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621361
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
hour=0;
begin
  while chour <= 23 do
  begin
    
    CASE WHEN EXTRACT(HOUR FROM T_START)<=chour and EXTRACT(HOUR FROM T_STOP)>=chour
         THEN CASE WHEN EXTRACT(HOUR FROM T_START)<chour and EXTRACT(HOUR FROM T_STOP)>chour THEN CAST('13:00:00' AS TIME)-CAST('12:00:00' AS TIME)
                   WHEN EXTRACT(HOUR FROM T_START)<chour THEN CAST(T_STOP AS TIME)-CAST('12:00:00' AS TIME)
                   WHEN EXTRACT(HOUR FROM T_STOP)>chour THEN CAST('13:00:00' AS TIME)-CAST(T_START AS TIME)
                   ELSE CAST(T_STOP AS TIME)-CAST(T_START AS TIME) END
         ELSE 0 END AS Between12and13,

    chour = chour + 1;
  end
end


Вот что выходит, как прописать теперь в этом цикле время с прибавлением в час? Я в процедурном языке FireBird не особо то и силен, поэтому и обратился на форум.

ps да, знаю что код у меня бредовый :D
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621477
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

Код: sql
1.
MYTIME=DATEADD(HOUR,1,MYTIME);
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621561
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне искренне жаль этого препода. Неглупый мужик, право слово, и искренне пытается научить думать. Человек придумывает типы заданий, вносит антураж словоблудием и маскирует схожесть, а студеры идут сюда и папки, топорща пёрышки, раз за разом клепают им курсовики.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39621569
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПМ> Мне искренне жаль этого препода. Неглупый мужик, право слово,
СПМ> и искренне пытается научить думать. Человек придумывает типы
СПМ> заданий, вносит антураж словоблудием и маскирует схожесть

Ты его знаешь что ли? А-то я что-то не заметил интересных заданий и
стимулирующего антуража (да и вообще, интерес должен превалировать
в школе, а не в универе, ИМХО). Лучше бы азам хорошенько научил.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39622227
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старый плюшевый мишкаМне искренне жаль этого препода.
Мне тоже.

Вот, что выходит, но не компиллируется.. Помогите плз, вникать полностью в синтаксис нет времени.
Код: sql
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.
begin
  chour=0;
  for select
    t1.user_name,
    while chour <= 23 do
    begin
      select (CASE WHEN EXTRACT(HOUR FROM t1.time_start)<=chour and EXTRACT(HOUR FROM t1.time_stop)>=chour
         THEN CASE WHEN EXTRACT(HOUR FROM t1.time_start)<chour and EXTRACT(HOUR FROM t1.time_start)>chour THEN CAST(dateadd(hour, chour + 1, cast('00:00:00' as time)) AS TIME)-CAST(dateadd(hour, 1, cast('00:00:00' as time)) AS TIME)
                   WHEN EXTRACT(HOUR FROM t1.time_start)<chour THEN CAST(t1.time_stop AS TIME)-CAST(dateadd(hour, 1, cast('00:00:00' as time)) AS TIME)
                   WHEN EXTRACT(HOUR FROM t1.time_stop)>chour THEN CAST(dateadd(hour, 1 + 1, cast('00:00:00' as time)) AS TIME)-CAST(t1.time_start AS TIME)
                   ELSE CAST(t1.time_stop AS TIME)-CAST(t1.time_start AS TIME) END
         ELSE 0 END AS Between12and13);
    chour = chour + 1;
    end
  from table1 t1
    where (
           cast(t1.time_start as Date) = :D and
           cast(t1.time_stop as Date) = :D
                                  )

  group by
    t1.user_name

  into
  :USER_NAME,
  :"08:00 - 09:00",
  :"09:00 - 10:00",
  :"10:00 - 11:00",
  :"11:00 - 12:00",
  :"12:00 - 13:00",
  :"13:00 - 14:00",
  :"14:00 - 15:00",
  :"15:00 - 16:00",
  :"16:00 - 17:00",
  :"17:00 - 18:00",
  :"18:00 - 19:00",
  :"19:00 - 20:00",
  :"20:00 - 21:00",
  :"21:00 - 22:00",
  :"22:00 - 23:00",
  :"23:00 - 00:00",
  :"00:00 - 01:00",
  :"01:00 - 02:00",
  :"02:00 - 03:00",
  :"03:00 - 04:00",
  :"04:00 - 05:00",
  :"05:00 - 06:00",
  :"06:00 - 07:00",
  :"07:00 - 08:00"

  do
  begin
    suspend;
  end
end



Вот, кстати еще решение, но тут считает не совсем верно. Мне нужно считать время в час, даже если Time_begin было с 8 утра, т.е. сотрудники ходят на перерывы - соответственно меняют статус, а в данном случае запрос выбирает значения Time_begin и Time_end в пределах одного часа, если нет совпадений, то выводит null...
Код: sql
1.
avg(iif(cast(time_begin as time) >= cast('10:00:00' as time) and cast(time_end as time) < cast('11:00:00' as time), datediff(second, time_begin, time_end), null))/60 as "10:00 - 11:00",



В общем, вопрос все еще открыт
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39622235
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordне компиллируетсякол-во затребованных столбцов не соответствует кол-ву переменных?

Нет такой ошибки "не компилируется", есть вполне конкретные со ссылками на конкретные строки хранимки.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39622238
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky, ошибка в while.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39622355
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а... вона оно как. Так как ты написал писать решительно нельзя. Нельзя тут цикл впендюрить, только копипастом. Перечислил все поля, в секции инто столько же переменных куда записать результат.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39622434
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тем самым я возвращаюсь в начало. В итоге 5 строк в результате, я так думаю, что надо складывать что-то где-то.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39623001
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На текущий момент имею такое решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    SUM((CASE
        WHEN EXTRACT(HOUR FROM T1.T_START)<=9 and EXTRACT(HOUR FROM T1.T_STOP)>=9
        THEN CASE WHEN EXTRACT(HOUR FROM T1.T_START)<9 and EXTRACT(HOUR FROM T1.T_STOP)>9 THEN CAST('10:00:00' AS TIME)-CAST('09:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM T1.T_START)<9 THEN CAST(T1.T_STOP AS TIME)-CAST('09:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM T1.T_STOP)>9 THEN CAST('10:00:00' AS TIME)-CAST(T1.T_START AS TIME)
        ELSE CAST(T1.T_STOP AS TIME)-CAST(T1.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between09and10,

  from TABLE1 T1 wt

    where (T1.state_id = 1) and (
           cast(T1.T_START as timestamp) < DATEADD(8 HOUR TO DATEADD(1 DAY TO :D)) and
           cast(T1.T_STOP as timestamp) > DATEADD(8 HOUR TO :D)


Все считает, но за текущие сутки, а мне нужно с 8 утра выбранного дня (входная переменная :D) до 8 утра следующего дня. Условие WHERE прописал, но все равно как надо не работает. Нужно вычитать не часы TIME, а даты TIMESTAMP. Попробовал заменить код
Код: sql
1.
CAST(T1.T_STOP AS TIME)-CAST('08:00:00' AS TIME)


на
Код: sql
1.
CAST(DATEADD(HOUR, -8, T1.T_STOP) AS TIMESTAMP)


Не запускается процедура, выдает ошибку:
авторStrings can not be devided in dialect 3
Странно, я ж не пытаюсь разделить строку.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39623019
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordавторStrings can not be devided in dialect 3Прямо так и написано? А то мне слово d _i_ vided глаз резануло.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39623052
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery, суть от этого не меняется)
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39623728
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
procedure
Код: sql
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.
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SPLIT_WORKTIME
RETURNS (
    USER_ID TYPE OF COLUMN WORKTIME.USER_ID,
    T_START TYPE OF COLUMN WORKTIME.T_START,
    T_STOP TYPE OF COLUMN WORKTIME.T_STOP)
AS
DECLARE VARIABLE TEMP_STOP TIMESTAMP;
DECLARE VARIABLE SPLIT_TIME TIMESTAMP;
BEGIN
  FOR SELECT
          USER_ID,
          T_START,
          T_STOP
      FROM WORKTIME
      INTO :USER_ID,
           :T_START,
           :T_STOP
  DO
  BEGIN
    IF (DATEDIFF(HOUR, T_START, T_STOP) > 0) THEN
    BEGIN
      SPLIT_TIME = CAST(T_START AS DATE);
      SPLIT_TIME = DATEADD(HOUR, EXTRACT(HOUR FROM T_START), SPLIT_TIME);
      SPLIT_TIME = DATEADD(HOUR, 1, SPLIT_TIME);

      TEMP_STOP = T_STOP;
      T_STOP = SPLIT_TIME;
      SUSPEND;

      WHILE (SPLIT_TIME < TEMP_STOP) DO
      BEGIN
        T_START = SPLIT_TIME;
        SPLIT_TIME = DATEADD(HOUR, 1, SPLIT_TIME);
        T_STOP = MINVALUE(SPLIT_TIME, TEMP_STOP);

        SUSPEND;
      END
    END
    ELSE
      SUSPEND;
  END
END
^

SET TERM ; ^

Развернуть результат вот этого запроса по стоблцам, я думаю, сможешь.
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
    USER_ID,
    EXTRACT(DAY FROM T_START),
    EXTRACT(HOUR FROM T_START),
    SUM(DATEDIFF(MINUTE, T_START, T_STOP))
FROM SPLIT_WORKTIME
GROUP BY 1, 2, 3
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629126
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flashpoke, я не знаю как применить вашу процедуру к моей базе и что куда вставить скопировать.... вот моя целиком:
Код: sql
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.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
create or alter procedure USER_WORKTIME (
    USER_ID D_USER,
    D D_DATE)
returns (
    USER_NAME D_USER,
    "08:00 - 09:00" D_BAL2,
    "09:00 - 10:00" D_BAL2,
    "10:00 - 11:00" D_BAL2,
    "11:00 - 12:00" D_BAL2,
    "12:00 - 13:00" D_BAL2,
    "13:00 - 14:00" D_BAL2,
    "14:00 - 15:00" D_BAL2,
    "15:00 - 16:00" D_BAL2,
    "16:00 - 17:00" D_BAL2,
    "17:00 - 18:00" D_BAL2,
    "18:00 - 19:00" D_BAL2,
    "19:00 - 20:00" D_BAL2,
    "20:00 - 21:00" D_BAL2,
    "21:00 - 22:00" D_BAL2,
    "22:00 - 23:00" D_BAL2,
    "23:00 - 00:00" D_BAL2,
    "00:00 - 01:00" D_BAL2,
    "01:00 - 02:00" D_BAL2,
    "02:00 - 03:00" D_BAL2,
    "03:00 - 04:00" D_BAL2,
    "04:00 - 05:00" D_BAL2,
    "05:00 - 06:00" D_BAL2,
    "06:00 - 07:00" D_BAL2,
    "07:00 - 08:00" D_BAL2)
as
begin
  for select
    u1.user_name,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=8 and EXTRACT(HOUR FROM WT.T_STOP)>=8
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<8 and EXTRACT(HOUR FROM WT.T_STOP)>8 THEN CAST('09:00:00' AS TIME)-CAST('08:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<8 THEN CAST(WT.T_STOP AS TIME)-CAST('08:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>8 THEN CAST('09:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between08and09,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=9 and EXTRACT(HOUR FROM WT.T_STOP)>=9
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<9 and EXTRACT(HOUR FROM WT.T_STOP)>9 THEN CAST('10:00:00' AS TIME)-CAST('09:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<9 THEN CAST(WT.T_STOP AS TIME)-CAST('09:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>9 THEN CAST('10:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between09and10,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=10 and EXTRACT(HOUR FROM WT.T_STOP)>=10
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<10 and EXTRACT(HOUR FROM WT.T_STOP)>10 THEN CAST('11:00:00' AS TIME)-CAST('10:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<10 THEN CAST(WT.T_STOP AS TIME)-CAST('10:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>10 THEN CAST('11:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between10and11,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=11 and EXTRACT(HOUR FROM WT.T_STOP)>=11
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<11 and EXTRACT(HOUR FROM WT.T_STOP)>11 THEN CAST('12:00:00' AS TIME)-CAST('11:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<11 THEN CAST(WT.T_STOP AS TIME)-CAST('11:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>11 THEN CAST('12:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between11and12,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=12 and EXTRACT(HOUR FROM WT.T_STOP)>=12
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<12 and EXTRACT(HOUR FROM WT.T_STOP)>12 THEN CAST('13:00:00' AS TIME)-CAST('12:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<12 THEN CAST(WT.T_STOP AS TIME)-CAST('12:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>12 THEN CAST('13:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between12and13,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=13 and EXTRACT(HOUR FROM WT.T_STOP)>=13
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<13 and EXTRACT(HOUR FROM WT.T_STOP)>13 THEN CAST('14:00:00' AS TIME)-CAST('13:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<13 THEN CAST(WT.T_STOP AS TIME)-CAST('13:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>13 THEN CAST('14:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between13and14,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=14 and EXTRACT(HOUR FROM WT.T_STOP)>=14
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<14 and EXTRACT(HOUR FROM WT.T_STOP)>14 THEN CAST('15:00:00' AS TIME)-CAST('14:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<14 THEN CAST(WT.T_STOP AS TIME)-CAST('14:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>14 THEN CAST('15:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between14and15,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=15 and EXTRACT(HOUR FROM WT.T_STOP)>=15
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<15 and EXTRACT(HOUR FROM WT.T_STOP)>15 THEN CAST('16:00:00' AS TIME)-CAST('15:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<15 THEN CAST(WT.T_STOP AS TIME)-CAST('15:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>15 THEN CAST('16:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between15and16,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=16 and EXTRACT(HOUR FROM WT.T_STOP)>=16
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<16 and EXTRACT(HOUR FROM WT.T_STOP)>16 THEN CAST('17:00:00' AS TIME)-CAST('16:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<16 THEN CAST(WT.T_STOP AS TIME)-CAST('16:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>16 THEN CAST('17:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between16and17,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=17 and EXTRACT(HOUR FROM WT.T_STOP)>=17
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<17 and EXTRACT(HOUR FROM WT.T_STOP)>17 THEN CAST('18:00:00' AS TIME)-CAST('17:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<17 THEN CAST(WT.T_STOP AS TIME)-CAST('17:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>17 THEN CAST('18:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between17and18,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=18 and EXTRACT(HOUR FROM WT.T_STOP)>=18
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<18 and EXTRACT(HOUR FROM WT.T_STOP)>18 THEN CAST('19:00:00' AS TIME)-CAST('18:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<18 THEN CAST(WT.T_STOP AS TIME)-CAST('18:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>18 THEN CAST('19:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between18and19,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=19 and EXTRACT(HOUR FROM WT.T_STOP)>=19
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<19 and EXTRACT(HOUR FROM WT.T_STOP)>19 THEN CAST('20:00:00' AS TIME)-CAST('19:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<19 THEN CAST(WT.T_STOP AS TIME)-CAST('19:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>19 THEN CAST('20:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between19and20,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=20 and EXTRACT(HOUR FROM WT.T_STOP)>=20
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<20 and EXTRACT(HOUR FROM WT.T_STOP)>20 THEN CAST('21:00:00' AS TIME)-CAST('20:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<20 THEN CAST(WT.T_STOP AS TIME)-CAST('20:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>20 THEN CAST('21:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between20and21,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=21 and EXTRACT(HOUR FROM WT.T_STOP)>=21
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<21 and EXTRACT(HOUR FROM WT.T_STOP)>21 THEN CAST('22:00:00' AS TIME)-CAST('21:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<21 THEN CAST(WT.T_STOP AS TIME)-CAST('21:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>21 THEN CAST('22:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between21and22,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=22 and EXTRACT(HOUR FROM WT.T_STOP)>=22
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<22 and EXTRACT(HOUR FROM WT.T_STOP)>22 THEN CAST('23:00:00' AS TIME)-CAST('22:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<22 THEN CAST(WT.T_STOP AS TIME)-CAST('22:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>22 THEN CAST('23:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between22and23,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=23 and EXTRACT(HOUR FROM WT.T_STOP)>=23
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<23 and EXTRACT(HOUR FROM WT.T_STOP)>23 THEN CAST('23:59:59' AS TIME)-CAST('23:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<23 THEN CAST(WT.T_STOP AS TIME)-CAST('23:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>23 THEN CAST('23:59:59' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between23and00,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=0 and EXTRACT(HOUR FROM WT.T_STOP)>=0
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<0 and EXTRACT(HOUR FROM WT.T_STOP)>0 THEN CAST('01:00:00' AS TIME)-CAST('00:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<0 THEN CAST(WT.T_STOP AS TIME)-CAST('00:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>0 THEN CAST('01:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between00and01,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=1 and EXTRACT(HOUR FROM WT.T_STOP)>=1
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<1 and EXTRACT(HOUR FROM WT.T_STOP)>1 THEN CAST('02:00:00' AS TIME)-CAST('01:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<1 THEN CAST(WT.T_STOP AS TIME)-CAST('01:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>1 THEN CAST('02:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between01and02,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=2 and EXTRACT(HOUR FROM WT.T_STOP)>=2
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<2 and EXTRACT(HOUR FROM WT.T_STOP)>2 THEN CAST('03:00:00' AS TIME)-CAST('02:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<2 THEN CAST(WT.T_STOP AS TIME)-CAST('02:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>2 THEN CAST('03:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between02and03,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=3 and EXTRACT(HOUR FROM WT.T_STOP)>=3
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<3 and EXTRACT(HOUR FROM WT.T_STOP)>3 THEN CAST('04:00:00' AS TIME)-CAST('03:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<3 THEN CAST(WT.T_STOP AS TIME)-CAST('03:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>3 THEN CAST('04:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between03and04,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=4 and EXTRACT(HOUR FROM WT.T_STOP)>=4
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<4 and EXTRACT(HOUR FROM WT.T_STOP)>4 THEN CAST('05:00:00' AS TIME)-CAST('04:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<4 THEN CAST(WT.T_STOP AS TIME)-CAST('04:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>4 THEN CAST('05:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between04and05,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=5 and EXTRACT(HOUR FROM WT.T_STOP)>=5
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<5 and EXTRACT(HOUR FROM WT.T_STOP)>5 THEN CAST('06:00:00' AS TIME)-CAST('05:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<5 THEN CAST(WT.T_STOP AS TIME)-CAST('05:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>5 THEN CAST('06:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between05and06,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=6 and EXTRACT(HOUR FROM WT.T_STOP)>=6
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<6 and EXTRACT(HOUR FROM WT.T_STOP)>6 THEN CAST('07:00:00' AS TIME)-CAST('06:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<6 THEN CAST(WT.T_STOP AS TIME)-CAST('06:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>6 THEN CAST('07:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between06and07,
    SUM((CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=7 and EXTRACT(HOUR FROM WT.T_STOP)>=7
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<7 and EXTRACT(HOUR FROM WT.T_STOP)>7 THEN CAST('08:00:00' AS TIME)-CAST('07:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<7 THEN CAST(WT.T_STOP AS TIME)-CAST('07:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>7 THEN CAST('08:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
    END)/60)/60 AS Between07and08


  from WORKTIME wt
	JOIN W_USERS U1 ON U1.USER_ID = WT.USER_ID
    where (
           cast(wt.T_START as timestamp) > DATEADD(7 HOUR TO :D) and
           cast(wt.T_STOP as timestamp) < DATEADD(33 HOUR TO :D)
                                  )


  group by
    u1.user_name

  into
  :USER_NAME,
  :"08:00 - 09:00",
  :"09:00 - 10:00",
  :"10:00 - 11:00",
  :"11:00 - 12:00",
  :"12:00 - 13:00",
  :"13:00 - 14:00",
  :"14:00 - 15:00",
  :"15:00 - 16:00",
  :"16:00 - 17:00",
  :"17:00 - 18:00",
  :"18:00 - 19:00",
  :"19:00 - 20:00",
  :"20:00 - 21:00",
  :"21:00 - 22:00",
  :"22:00 - 23:00",
  :"23:00 - 00:00",
  :"00:00 - 01:00",
  :"01:00 - 02:00",
  :"02:00 - 03:00",
  :"03:00 - 04:00",
  :"04:00 - 05:00",
  :"05:00 - 06:00",
  :"06:00 - 07:00",
  :"07:00 - 08:00"

  do
  begin
    suspend;
  end
end


Результата так и не добился, надо считать с 8 утра до 8 утра следующего дня. На данный момент, если сотрудник работает, допустим, с 20:00 до 01:00 без перерывов - ему не правильно посчитается статус. Пробовал задавать промежутки без EXTRACT - не правильно считает.
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629297
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordРезультата так и не добилсяиндексы на WORKTIME какие есть? план запроса где?
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629312
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevskyиндексы на WORKTIME какие есть?
Индексов нет
Ivan_Pisarevskyплан запроса где?
Зачем план запроса? Нажимаю F9 в IBExpert, ввожу ID сотрудника и дату - на выходе получаю отработку в час
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629344
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordЗачем план запроса?В твою портянку не вникал, подумал, что работает очень долго.

В каждом часовом интервале надо сложить 4 числа:
1. если работа началась раньше часа и закончилась позже, то +1 час
2. если работа началась раньше часа и закончилась до конца, то + (время от конца работы - время начала часа)
3. если работа началась позже начала часа и закончилась позже, то + (время от конца часа - время начала работы)
4. если работа началась позже начала часа и закончилась до конца, то + (время от конца работы - время начала работы)

т.е то что я написал выше надо перевести на аглицкий
case ... end + case ... end + case ... end + case ... end AS BetweenXandY
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629347
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее так:
case ... else 0 end + case ...else 0 end + case ...else 0 end + case ...else 0 end AS BetweenXandY
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629355
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky,
у меня вроде по такому принципу и считает)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CASE
        WHEN EXTRACT(HOUR FROM WT.T_START)<=11 and EXTRACT(HOUR FROM WT.T_STOP)>=11
        THEN CASE WHEN EXTRACT(HOUR FROM WT.T_START)<11 and EXTRACT(HOUR FROM WT.T_STOP)>11 THEN CAST('12:00:00' AS TIME)-CAST('11:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_START)<11 THEN CAST(WT.T_STOP AS TIME)-CAST('11:00:00' AS TIME)
        WHEN EXTRACT(HOUR FROM WT.T_STOP)>11 THEN CAST('12:00:00' AS TIME)-CAST(WT.T_START AS TIME)
        ELSE CAST(WT.T_STOP AS TIME)-CAST(WT.T_START AS TIME) END
        ELSE 0
END


Только проблема в том, что мне нужно не
авторEXTRACT(HOUR FROM WT.T_START)<=11,
а TIME_STAMP, но когда перевожу в
авторWT.T_START < DATEADD(HOURS, 8, CAST(:DATE AS TIMESTAMP))
и остальные строки по аналогии, то программа не считает, либо считает неправильно (0,01, либо вообще 0 на выходе)
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629357
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, насчет плана, уже несколько раз и рисовал и писал по-русски, только перевести ну никак не выходит))
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629360
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

он имеет в виду план запроса, который показывает тот же IBExpert.
план на английском :)
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39629403
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordу меня вроде по такому принципу и считаетНе вижу суммы 4 слагаемых.

afordнасчет плана, уже несколько раз и рисовал и писал по-русски, только перевести ну никак не выходитПока нет проблем с производительностью, оставь план в покое. Да, переводить его решительно не нужно. :)
...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39630326
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afordFlashpoke, я не знаю как применить вашу процедуру к моей базе и что куда вставить скопировать...Печально.

Процедуры будет две.
Вспомогательная процедура
Код: sql
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.
CREATE OR ALTER PROCEDURE SPLIT_WORKTIME (
    START_DATE DATE,
    END_DATE DATE)
RETURNS (
    USER_ID INTEGER,
    T_START TIMESTAMP,
    T_STOP TIMESTAMP)
AS
DECLARE VARIABLE TEMP_STOP TIMESTAMP;
DECLARE VARIABLE SPLIT_TIME TIMESTAMP;
BEGIN
  FOR SELECT
          USER_ID,
          T_START,
          T_STOP
      FROM WORKTIME
      WHERE T_START BETWEEN :START_DATE AND :END_DATE
      INTO :USER_ID,
           :T_START,
           :T_STOP
  DO
  BEGIN
    IF (DATEDIFF(HOUR, T_START, T_STOP) > 0) THEN
    BEGIN
      SPLIT_TIME = CAST(T_START AS DATE);
      SPLIT_TIME = DATEADD(HOUR, EXTRACT(HOUR FROM T_START), SPLIT_TIME);
      SPLIT_TIME = DATEADD(HOUR, 1, SPLIT_TIME);

      TEMP_STOP = T_STOP;
      T_STOP = SPLIT_TIME;
      SUSPEND;

      WHILE (SPLIT_TIME < TEMP_STOP) DO
      BEGIN
        T_START = SPLIT_TIME;
        SPLIT_TIME = DATEADD(HOUR, 1, SPLIT_TIME);
        T_STOP = MINVALUE(SPLIT_TIME, TEMP_STOP);

        SUSPEND;
      END
    END
    ELSE
      SUSPEND;
  END
END

Основная процедура
Код: sql
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.
CREATE OR ALTER PROCEDURE GROUP_TIME (
    USER_ID INTEGER,
    D DATE)
RETURNS (
    USER_NAME VARCHAR(100),
    "08:00 - 09:00" DOUBLE PRECISION,
    "09:00 - 10:00" DOUBLE PRECISION,
    "10:00 - 11:00" DOUBLE PRECISION,
    "11:00 - 12:00" DOUBLE PRECISION,
    "12:00 - 13:00" DOUBLE PRECISION,
    "13:00 - 14:00" DOUBLE PRECISION,
    "14:00 - 15:00" DOUBLE PRECISION,
    "15:00 - 16:00" DOUBLE PRECISION,
    "16:00 - 17:00" DOUBLE PRECISION,
    "17:00 - 18:00" DOUBLE PRECISION,
    "18:00 - 19:00" DOUBLE PRECISION,
    "19:00 - 20:00" DOUBLE PRECISION,
    "20:00 - 21:00" DOUBLE PRECISION,
    "21:00 - 22:00" DOUBLE PRECISION,
    "22:00 - 23:00" DOUBLE PRECISION,
    "23:00 - 00:00" DOUBLE PRECISION,
    "00:00 - 01:00" DOUBLE PRECISION,
    "01:00 - 02:00" DOUBLE PRECISION,
    "02:00 - 03:00" DOUBLE PRECISION,
    "03:00 - 04:00" DOUBLE PRECISION,
    "04:00 - 05:00" DOUBLE PRECISION,
    "05:00 - 06:00" DOUBLE PRECISION,
    "06:00 - 07:00" DOUBLE PRECISION,
    "07:00 - 08:00" DOUBLE PRECISION)
AS
DECLARE VARIABLE CUR_DAY SMALLINT;
DECLARE VARIABLE NEXT_DAY SMALLINT;
DECLARE VARIABLE MINHOUR DOUBLE PRECISION;
BEGIN
  CUR_DAY = EXTRACT(DAY FROM :D);
  NEXT_DAY = EXTRACT(DAY FROM (:D + 1));
  MINHOUR = 1;
  MINHOUR = MINHOUR / 60;
  SELECT USER_NAME FROM W_USERS WHERE USER_ID = :USER_ID INTO :USER_NAME;

  SELECT
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 8 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 9 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 10 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 11 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 12 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 13 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 14 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 15 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 16 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 17 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 18 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 19 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 20 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 21 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 22 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :CUR_DAY AND W_HOUR = 23 THEN W_INTERVAL * :MINHOUR ELSE 0 END),

      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 0 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 1 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 2 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 3 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 4 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 5 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 6 THEN W_INTERVAL * :MINHOUR ELSE 0 END),
      SUM(CASE WHEN W_DAY = :NEXT_DAY AND W_HOUR = 7 THEN W_INTERVAL * :MINHOUR ELSE 0 END)
  FROM (SELECT
            USER_ID,
            EXTRACT(DAY FROM T_START) W_DAY,
            EXTRACT(HOUR FROM T_START) W_HOUR,
            SUM(DATEDIFF(MINUTE, T_START, T_STOP)) W_INTERVAL
        FROM SPLIT_WORKTIME(:D, DATEADD(DAY, 1, :D))
        GROUP BY 1, 2, 3)
  INTO
  :"08:00 - 09:00",
  :"09:00 - 10:00",
  :"10:00 - 11:00",
  :"11:00 - 12:00",
  :"12:00 - 13:00",
  :"13:00 - 14:00",
  :"14:00 - 15:00",
  :"15:00 - 16:00",
  :"16:00 - 17:00",
  :"17:00 - 18:00",
  :"18:00 - 19:00",
  :"19:00 - 20:00",
  :"20:00 - 21:00",
  :"21:00 - 22:00",
  :"22:00 - 23:00",
  :"23:00 - 00:00",
  :"00:00 - 01:00",
  :"01:00 - 02:00",
  :"02:00 - 03:00",
  :"03:00 - 04:00",
  :"04:00 - 05:00",
  :"05:00 - 06:00",
  :"06:00 - 07:00",
  :"07:00 - 08:00";

  SUSPEND;
END

...
Рейтинг: 0 / 0
Вычисление среднего значения за час
    #39630581
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flashpoke, большое спасибо!
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисление среднего значения за час
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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