Подсчет рабочего времени

царевич
Дата: 14.03.2011 19:09:56
Подскажите, как реализовать такую вещь

Я вычисляю данные из БД,потраченые на задачу, в виде:
ДатаВремяС
ДатаВремяПо

Рабочее время организации это будние дни с 10-19, без обеда(Хорошо бы учесть праздники(и раб выходные) в какой нить таблице)

Надо рассчитать сколько рабочего времени прошло между ДатаВремяС и ДатаВремяПо

Возможно ли такое реализовать?Ума не приложу как это сделать!?

спасибо
comphead
Дата: 14.03.2011 19:15:33
царевич,

(ДатаВремяПо - ДатаВремяС) * 24
PooH_2
Дата: 14.03.2011 22:10:59
царевич,
в Delphi нашел похожую тему... может пригодится.
PooH_2
Дата: 14.03.2011 22:20:16
царевич,

Да и в этом подфоруме есть похожие темы
царевич
Дата: 15.03.2011 00:05:13
Посмотрел, спасибо
Но мне нужно учитывать именно по часам, а не по дням
например
ДатаВремяС=18.03.2011 20:00:00 (пЯТНИЦА)
ДатаВремяПО=21:03:2011 10:20:00 (Понедельник)

Затраты рабочего времени 20 минут
AmKad
Дата: 15.03.2011 00:49:50
+
with s as( -- отмеченное фактическое время работы
select to_timestamp('16.03.2011 11:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_1, to_timestamp('16:03:2011 18:20:00', 'dd.mm.yyyy hh24:mi:ss') dt_2 from dual union all
select to_timestamp('17.03.2011 09:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_1, to_timestamp('17:03:2011 21:20:00', 'dd.mm.yyyy hh24:mi:ss') dt_2 from dual union all
select to_timestamp('18.03.2011 20:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_1, to_timestamp('21:03:2011 10:20:00', 'dd.mm.yyyy hh24:mi:ss') dt_2 from dual union all
select to_timestamp('22.03.2011 16:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_1, to_timestamp('23:03:2011 14:30:00', 'dd.mm.yyyy hh24:mi:ss') dt_2 from dual
),
d as ( -- норма часов
select to_timestamp('16.03.2011 10:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_beg, to_timestamp('16.03.2011 19:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_end from dual union all
select to_timestamp('17.03.2011 10:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_beg, to_timestamp('17.03.2011 19:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_end from dual union all
select to_timestamp('18.03.2011 10:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_beg, to_timestamp('18.03.2011 19:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_end from dual union all
select to_timestamp('21.03.2011 10:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_beg, to_timestamp('21.03.2011 19:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_end from dual union all
select to_timestamp('22.03.2011 10:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_beg, to_timestamp('22.03.2011 19:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_end from dual union all
select to_timestamp('23.03.2011 10:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_beg, to_timestamp('23.03.2011 19:00:00', 'dd.mm.yyyy hh24:mi:ss') dt_end from dual
)
select trunc(dt_end) day, least(dt_end, dt_2) - greatest(dt_beg, dt_1) work_time
from s, d
where dt_1 between dt_beg and dt_end or dt_beg between dt_1 and dt_2
order by 1;

DAY             WORK_TIME
--------------- ------------------------------
16.03.2011      +000000000 07:20:00.000000000
17.03.2011      +000000000 09:00:00.000000000
21.03.2011      +000000000 00:20:00.000000000
22.03.2011      +000000000 03:00:00.000000000
23.03.2011      +000000000 04:30:00.000000000

SQL>
andreymx
Дата: 15.03.2011 06:24:29
царевич
Хорошо бы учесть праздники(и раб выходные) в какой нить таблице
для этого обычно создаётся календарь - где прописан каждый день -> дата, время начала+продолжительность рабочей смены
Господин
Дата: 15.03.2011 08:38:08
Похожую задачу давали на собеседовании одно кренделю
PooH_2
Дата: 15.03.2011 08:39:37
царевич,

Но мне нужно учитывать именно по часам, а не по дням

Что мешает вычислить полные дни, и добавить время первого и последнего дня? ;)
doctor932
Дата: 17.03.2011 17:56:22
Поможет аналитическая функция lag