powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / подсчет отработанных часов
5 сообщений из 5, страница 1 из 1
подсчет отработанных часов
    #38602983
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть таблица
user_id
exec_time
task_id
code_id (1 начало работы, 2 перерыв, 3 конец рабочего дня)

Нужно посчитать сколько работал часов в день сотрудник.
перерыв не учитывать. НИкак не получается написать SQL запрос
...
Рейтинг: 0 / 0
подсчет отработанных часов
    #38603146
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как определить начало и конец перерыва?
...
Рейтинг: 0 / 0
подсчет отработанных часов
    #38603371
Dim666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

если без перерыва (ибо, как выше написал, неясно как считать его продолжительность), то как-то так вычисляются рабочие дни
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH log AS (SELECT * FROM (VALUES
 (12,'12-JAN-14 08:00'::timestamp,1), (12,'12-JAN-14 14:00'::timestamp,3),
 (12,'13-JAN-14 08:00'::timestamp,1), (12,'13-JAN-14 16:00'::timestamp,3),
 (12,'14-JAN-14 08:00'::timestamp,1), (12,'14-JAN-14 15:30'::timestamp,3),
 (12,'02-APR-14 08:00'::timestamp,1)
) as f (user_id, exec_time, code_id))
SELECT a.user_id, a.exec_time as start_work, COALESCE(min(b.exec_time),now()) as stop_work
 FROM log a LEFT JOIN log b ON (b.code_id=3 and a.user_id=b.user_id and a.exec_time<=b.exec_time)
 WHERE a.code_id=1 GROUP BY a.user_id, a.exec_time ORDER BY 1,2

user_id | start_work | stop_work 12 | 2013-01-12 08:00:00 | 2013-01-12 14:00:00+04 12 | 2013-01-13 08:00:00 | 2013-01-13 16:00:00+04 12 | 2013-01-14 08:00:00 | 2013-01-14 15:30:00+04 12 | 2013-04-02 08:00:00 | 2014-04-02 17:38:42.623754+04(4 строки)
Соответственно потом нужно по каждому юзеру посчитать sum(stop_work - start_work) в часах.
...
Рейтинг: 0 / 0
подсчет отработанных часов
    #38603381
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

Здесь не принято приводить ddl и пример данных?

Первая попытка.
version, create table, insert data
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
bctm201401=# select version();
                                            version
-----------------------------------------------------------------------------------------------
 PostgreSQL 8.4.12 on x86_64-unknown-linux-gnu, compiled by GCC gcc (SUSE Linux) 4.6.2, 64-bit
(1 row)


bctm201401=# 
Код: 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.
CREATE TABLE xx_time
(
   timeid bigint primary key,
   userid integer, 
   dt timestamp with time zone, 
   code integer
) 
WITH ( OIDS = FALSE );

insert into xx_time (timeid, userid, dt, code) values 
( 1,1,'2014-04-01 08:00',1),
( 2,1,'2014-04-01 08:50',2),
( 3,1,'2014-04-01 08:55',1),
( 4,1,'2014-04-01 11:30',2),
( 5,1,'2014-04-01 11:40',1),
( 6,1,'2014-04-01 12:00',2),
( 7,1,'2014-04-01 13:00',1),
( 8,1,'2014-04-01 15:00',2),
( 9,1,'2014-04-01 17:00',3),

(10,2,'2014-04-01 08:00',1),
(11,2,'2014-04-01 12:00',2),
(12,2,'2014-04-01 13:00',1),
(13,2,'2014-04-01 15:00',3),

(14,3,'2014-04-01 07:00',1),
(15,3,'2014-04-01 11:00',3),

(16,4,'2014-04-01 08:00',1),
(17,4,'2014-04-01 12:00',2),

(18,5,'2014-04-01 08:00',1),
(19,5,'2014-04-01 12:00',2),
(20,5,'2014-04-01 13:00',1),
(21,5,'2014-04-01 17:00',3);

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT userid, SUM( ival ) AS ttltime
  FROM (SELECT userid,
               dt,
               dtnext,
               dtnext - dt AS ival
          FROM (SELECT userid,
                       dt,
                       LEAD( dt ) OVER (PARTITION BY userid ORDER BY userid, dt) AS dtnext,
                       code,
                       LEAD( code ) OVER (PARTITION BY userid ORDER BY userid, dt) AS codenext
                  FROM xx_time) x
         WHERE     code = 1
               AND codenext IN (2, 3)) x
GROUP BY userid
...
Рейтинг: 0 / 0
подсчет отработанных часов
    #38603747
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходные данные
Код: 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.
CREATE TABLE xx_time
(
   timeid bigint primary key,
   userid integer, 
   dt timestamp with time zone, 
   code integer
) 
WITH ( OIDS = FALSE );

insert into xx_time (timeid, userid, dt, code) values 
( 1,1,'2014-04-01 08:00',1),
( 2,1,'2014-04-01 08:50',2),
( 3,1,'2014-04-01 08:55',1),
( 4,1,'2014-04-01 11:30',2),
( 5,1,'2014-04-01 11:40',1),
( 6,1,'2014-04-01 12:00',2),
( 7,1,'2014-04-01 13:00',1),
( 8,1,'2014-04-01 15:00',2),
( 9,1,'2014-04-01 17:00',3),

(10,2,'2014-04-01 08:00',1),
(11,2,'2014-04-01 12:00',2),
(12,2,'2014-04-01 13:00',1),
(13,2,'2014-04-01 15:00',3),

(14,3,'2014-04-01 07:00',1),
(15,3,'2014-04-01 11:00',3),

(16,4,'2014-04-01 08:00',1),
(17,4,'2014-04-01 12:00',2),

(18,5,'2014-04-01 08:00',1),
(19,5,'2014-04-01 12:00',2),
(20,5,'2014-04-01 13:00',1),
(21,5,'2014-04-01 17:00',3),



(31,1,'2014-04-02 08:00',1),
(32,1,'2014-04-02 08:50',2),
(33,1,'2014-04-02 08:55',1),
(34,1,'2014-04-02 11:30',2),
(35,1,'2014-04-02 11:40',1),
(36,1,'2014-04-02 12:00',2),
(37,1,'2014-04-02 13:00',1),
(38,1,'2014-04-02 15:00',2),
(39,1,'2014-04-02 17:00',3),

(40,2,'2014-04-02 08:00',1),
(41,2,'2014-04-02 12:00',2),
(42,2,'2014-04-02 13:00',1),
(43,2,'2014-04-02 15:00',3),

(44,3,'2014-04-02 07:00',1),
(45,3,'2014-04-02 11:00',3),

(46,4,'2014-04-02 08:00',1),
(47,4,'2014-04-02 12:00',2),

(48,5,'2014-04-02 08:00',1),
(49,5,'2014-04-02 12:00',2),
(50,5,'2014-04-02 13:00',1),
(51,5,'2014-04-02 17:00',3);



Спасибо за помощь!
вощем вот что получилось

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
cast(date_trunc('day',dt) as date),
userid,
sum(age((select min(dt)
         from xx_time b
         where b.dt>a.dt
           and b.userid=a.userid),
        a.dt))
from xx_time a
where code=1
group by date_trunc('day',dt),userid
order by userid,date_trunc('day',dt)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / подсчет отработанных часов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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