powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисление среднего значения за час
25 сообщений из 32, страница 1 из 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
25 сообщений из 32, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисление среднего значения за час
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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