Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисление среднего значения за час / 25 сообщений из 32, страница 1 из 2
27.03.2018, 09:22
    #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
27.03.2018, 14:14
    #39621197
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
aford,

должно натолкнуть на мысль
Перечисления в CASE
...
Рейтинг: 0 / 0
27.03.2018, 14:47
    #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
27.03.2018, 15:24
    #39621269
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
aford,

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

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

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

Можно пример?
...
Рейтинг: 0 / 0
27.03.2018, 15:54
    #39621296
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
afordМожно пример?Пример мною описанного решения будет законченным.
...
Рейтинг: 0 / 0
27.03.2018, 16:32
    #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
27.03.2018, 17:52
    #39621477
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
aford,

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

Ты его знаешь что ли? А-то я что-то не заметил интересных заданий и
стимулирующего антуража (да и вообще, интерес должен превалировать
в школе, а не в универе, ИМХО). Лучше бы азам хорошенько научил.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2018, 17:24
    #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
28.03.2018, 17:34
    #39622235
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
afordне компиллируетсякол-во затребованных столбцов не соответствует кол-ву переменных?

Нет такой ошибки "не компилируется", есть вполне конкретные со ссылками на конкретные строки хранимки.
...
Рейтинг: 0 / 0
28.03.2018, 17:37
    #39622238
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
Ivan_Pisarevsky, ошибка в while.
...
Рейтинг: 0 / 0
28.03.2018, 21:18
    #39622355
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
а... вона оно как. Так как ты написал писать решительно нельзя. Нельзя тут цикл впендюрить, только копипастом. Перечислил все поля, в секции инто столько же переменных куда записать результат.
...
Рейтинг: 0 / 0
29.03.2018, 08:47
    #39622434
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
Тем самым я возвращаюсь в начало. В итоге 5 строк в результате, я так думаю, что надо складывать что-то где-то.
...
Рейтинг: 0 / 0
30.03.2018, 08:37
    #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
30.03.2018, 09:23
    #39623019
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
afordавторStrings can not be devided in dialect 3Прямо так и написано? А то мне слово d _i_ vided глаз резануло.
...
Рейтинг: 0 / 0
30.03.2018, 10:07
    #39623052
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
WildSery, суть от этого не меняется)
...
Рейтинг: 0 / 0
31.03.2018, 17:11
    #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
12.04.2018, 13:57
    #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
12.04.2018, 16:34
    #39629297
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
afordРезультата так и не добилсяиндексы на WORKTIME какие есть? план запроса где?
...
Рейтинг: 0 / 0
12.04.2018, 16:52
    #39629312
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
Ivan_Pisarevskyиндексы на WORKTIME какие есть?
Индексов нет
Ivan_Pisarevskyплан запроса где?
Зачем план запроса? Нажимаю F9 в IBExpert, ввожу ID сотрудника и дату - на выходе получаю отработку в час
...
Рейтинг: 0 / 0
12.04.2018, 17:22
    #39629344
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление среднего значения за час
afordЗачем план запроса?В твою портянку не вникал, подумал, что работает очень долго.

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

т.е то что я написал выше надо перевести на аглицкий
case ... end + case ... end + case ... end + case ... end AS BetweenXandY
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисление среднего значения за час / 25 сообщений из 32, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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