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

ОЧЕНЬ ОЧЕНЬ НУЖЕН ХЕЛП ВАШ !!!!!!!!!!!

Есть таблица worker_time, содержащая id работника (worker_id), время его захода на работу (dt_in) и время выхода с работы (dt_out) за каждый день
worker_id dt_in dt_out
1 10.01.2018 08:34:55 10.01.2018 11:34:55
1 10.01.2018 12:26:55 10.01.2018 15:49:55
1 10.01.2018 15:58:55 10.01.2018 17:20:55
2 10.01.2018 09:00:55 10.01.2018 14:00:55
2 10.01.2018 14:55:55 10.01.2018 18:05:55

Необходимо рассчитать кол-во отработанных часов, время обеда/перекура по каждому работнику за каждый день

Пока на ум приходит только пока вот такое.

SELECT worker_id as "Сотрудник",
ROUND((dt_out-dt_in) * 24,2) as "отработнано, в часах"
FROM worker_time;

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with q as (select 1 as id, to_date('10.01.2018 08:34:55','DD.MM.YYYY HH24:MI:SS') as come_in, to_date('10.01.2018 11:34:55','DD.MM.YYYY HH24:MI:SS') as come_out from dual union all
select 1, to_date('10.01.2018 12:26:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 15:49:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 1, to_date('10.01.2018 15:58:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 17:20:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2, to_date('10.01.2018 09:00:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 14:00:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2, to_date('10.01.2018 14:55:59','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 18:05:55','DD.MM.YYYY HH24:MI:SS') from dual)

select id
, trunc(sum(q.come_out-q.come_in)*24)
||':'||lpad(trunc(((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60),2,'0')
||':'||lpad(trunc(((((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60) - trunc(((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60))*60),2,'0') as "Отработано"
 from q group by id
...
Рейтинг: 0 / 0
Рассчитать кол-во отработанных часов, время обеда/перекура для каждого работника
    #39606034
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если работник пришел в 5ч утра, а рабочий день начинается с 8ч?
Или пришел, но вообще не уходил (жена выгнала)
...
Рейтинг: 0 / 0
Рассчитать кол-во отработанных часов, время обеда/перекура для каждого работника
    #39606040
Malenki_2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DshedooMalenki_2000,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with q as (select 1 as id, to_date('10.01.2018 08:34:55','DD.MM.YYYY HH24:MI:SS') as come_in, to_date('10.01.2018 11:34:55','DD.MM.YYYY HH24:MI:SS') as come_out from dual union all
select 1, to_date('10.01.2018 12:26:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 15:49:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 1, to_date('10.01.2018 15:58:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 17:20:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2, to_date('10.01.2018 09:00:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 14:00:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2, to_date('10.01.2018 14:55:59','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 18:05:55','DD.MM.YYYY HH24:MI:SS') from dual)

select id
, trunc(sum(q.come_out-q.come_in)*24)
||':'||lpad(trunc(((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60),2,'0')
||':'||lpad(trunc(((((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60) - trunc(((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60))*60),2,'0') as "Отработано"
 from q group by id



Спасибо за селект с отработанным временнем, а как же посчитать из всей этой петрушки время перерыва?
...
Рейтинг: 0 / 0
Рассчитать кол-во отработанных часов, время обеда/перекура для каждого работника
    #39606070
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Malenki_2000а как же посчитать из всей этой петрушки время перерыва
24 часа минусавторселект с отработанным временнем
...
Рейтинг: 0 / 0
Рассчитать кол-во отработанных часов, время обеда/перекура для каждого работника
    #39606084
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Malenki_2000,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with q as (select 1 as id, to_date('10.01.2018 08:34:55','DD.MM.YYYY HH24:MI:SS') as come_in, to_date('10.01.2018 11:34:55','DD.MM.YYYY HH24:MI:SS') as come_out from dual union all
select 1, to_date('10.01.2018 12:26:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 15:49:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 1, to_date('10.01.2018 15:58:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 17:20:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2, to_date('10.01.2018 09:00:55','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 14:00:55','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2, to_date('10.01.2018 14:55:59','DD.MM.YYYY HH24:MI:SS'), to_date('10.01.2018 18:05:55','DD.MM.YYYY HH24:MI:SS') from dual)

select id, (to_char(min(come_in),'HH24:MI:SS')||' - '||to_char(max(come_out),'HH24:MI:SS')) as "За период"
, lpad(trunc(sum(q.come_out-q.come_in)*24),2,'0')
||':'||lpad(trunc(((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60),2,'0')
||':'||lpad(trunc(((((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60) - trunc(((sum(q.come_out-q.come_in)*24)-trunc(sum(q.come_out-q.come_in)*24))*60))*60),2,'0') as "Отработано"
, lpad(trunc(((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24),2,'0')
||':'||lpad(trunc(((((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24)-trunc(((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24))*60),2,'0')
||':'||lpad(trunc(((((((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24)-trunc(((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24))*60) - trunc(((((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24)-trunc(((max(come_out) - min(come_in))-sum(q.come_out-q.come_in))*24))*60))*60),2,'0') as "Не Отработано"
 from q group by id


Но это всё равно имеет мало общего с реальностью.

В реальности у тебя таблица будет иметь вид:
Сотрудник - Тип_действия - Дата действия
Вася - пришёл - 8:00
Коля - пришёл - 9:00
Игнат - пришёл - 9:01
Коля - ушёл - 9:02

Но это уже совсем другая история...
...
Рейтинг: 0 / 0
Рассчитать кол-во отработанных часов, время обеда/перекура для каждого работника
    #39606090
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooНо это всё равно имеет мало общего с реальностью.

В реальности у тебя таблица будет иметь вид:
Сотрудник - Тип_действия - Дата действия
Вася - пришёл - 8:00
Коля - пришёл - 9:00
Игнат - пришёл - 9:01
Коля - ушёл - 9:02

Но это уже совсем другая история...Да и по дням данные не группируются
Malenki_2000Необходимо рассчитать кол-во отработанных часов, время обеда/перекура по каждому работнику за каждый день
...
Рейтинг: 0 / 0
Рассчитать кол-во отработанных часов, время обеда/перекура для каждого работника
    #39606093
В вопросе рабочего времени много нюансов, которые необходимо подробно описать.

Часть обсуждалась тут: отлов "опоздунов" на работу

А что такое обед, перекур, перерыв? Показывать ли их раздельно или совместно? Есть ли принудительное минимальное время обеда (никуда не уходил, смотрел котиков и кушал прямо из банки на рабочем месте)?

Конечно, самый простой вариант:
раб.время = sum(время_выхода_после_последнего_входа - время_входа)
по всем парам вход-выход, а
перерыв = (время_последнего_выхода - время_первого_входа) - раб.время

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


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