powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вычислить рабочее время для каждого дня в диапазоне дат?
11 сообщений из 11, страница 1 из 1
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581741
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть выборка которая возвращает дату начала работы над задачей и дату конца работы над задачей одного человека. Нужно посчитать сколько времени (в секундах) работал человек над этой задачей с учётом рабочего времени с 9:00 до 18:00 (выходные дни можно считать за рабочие - это облегчает задачу).

Есть такое:
SecondsIdRevRevisedDateChangedDateProjectName2786994572017-11-30 16:02:58.0772017-11-27 10:37:59.640SPIvanov

А должно получиться что-то типа такого:
Name27.11.201728.11.201729.11.201730.11.2017Ivanov587928800288007142
здесь 27.11 - 5879 секунд это разница между 10:37:59 и 09:00
а 30.11 - 7142 секунд это разница между 16:02:58 и 18:00
а 28000 - это 8 часов рабочего времени.

Куда хоть копать? ума не приложу как эту фиговину вытащить.
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581743
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создай (возможно, динамически) таблицу рабочего времени по дням, заведомо перекрывающую весь диапазон задачи - и всё станет легко и просто.
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581747
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

А можно поподробнее, я не совсем понимаю. Это типа такой?

date1date2......2017-11-28 09:00:00.0002017-11-28 18:00:00.0002017-11-29 09:00:00.0002017-11-29 18:00:00.0002017-11-30 09:00:00.0002017-11-30 18:00:00.000......
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581750
petre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MinistrBob,
Попробуйте сначала правильно расставить временные интервалы:
Наверное работы были начаты 27.11 а закончены 30.11.
Из этого и получаем, что 27-го необходимо находить длительность период с 10:37:59 до 18:00, а 30.11 - с 9:00 до 16:02:58 .
Ну а дальше календарь рабочих дней поможет.
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581753
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobЭто типа такой?Подойдёт...
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581767
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petre,

На да при описании ошибся, вы правильно указали временные интервалы. А дальше то что делать? Откуда взять календарь рабочих дней и как он мне поможет?
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581769
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

А как их объединить, я чего-то не догоняю?
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581778
petre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MinistrBob,
Сочинил, думаю правильно:
Код: sql
1.
2.
3.
4.
select case when tt.dateBegin>tc.date1 then tt.dateBegin else tc.date1 as BeginDate
       ,case when tt.dateEnd<tc.date2 then tt.dateend else tc.date2 as EndDate
 from tabletask as tt, tableCal as tc
 where tc.date1 between tt.dateBegin and tt.dateEnd or tc.date2 between tt.dateBegin and tt.dateEnd


Календарь можно сгенерировать по разному, неоднократно описывалось на форуме. Для теста можете вручную создать.
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581784
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petre,

Ооо, спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581834
petre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MinistrBob,

в предыдущем запросе потерял два слова:
Код: 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.
DECLARE @tabletask TABLE (
  [idtask] int,
  [dateBegin] datetime,
  [dateEnd] datetime)
INSERT INTO @tabletask
VALUES
(45, '2017-11-27 10:37:59.640', '2017-11-30 16:02:58.077')

DECLARE @tableCal TABLE (
  [date1] datetime,
  [date2] datetime)
INSERT INTO @tableCal
VALUES
('2017-11-26 09:00', '2017-11-26 18:00'),
('2017-11-27 09:00', '2017-11-27 18:00'),
('2017-11-28 09:00', '2017-11-28 18:00'),
('2017-11-29 09:00', '2017-11-29 18:00'),
('2017-11-30 09:00', '2017-11-30 18:00')

select sum(datediff(ss,begindate, endDate))
 from (
select case when tt.dateBegin>tc.date1 then tt.dateBegin else tc.date1 end as BeginDate
       ,case when tt.dateEnd<tc.date2 then tt.dateend else tc.date2 end as EndDate
 from @tabletask as tt, @tableCal as tc
 where tc.date1 between tt.dateBegin and tt.dateEnd or tc.date2 between tt.dateBegin and tt.dateEnd
 ) a
...
Рейтинг: 0 / 0
Как вычислить рабочее время для каждого дня в диапазоне дат?
    #39581984
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
case when tt.dateBegin>tc.date1 then tt.dateBegin else tc.date1 end as BeginDate


очередной офф-топик
Какой там уже сервер на дворе? 2017.
А год какой? 2018.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
XML - 2005
CLR - 2005
LEAD/LAG - 2008R2
CONCAT - 2012
JSON - 2016
STRING_AGG - 2017
REGEXP - NEVER
LEAST/GREATEST - NEVER



Ладно, регулярки сами по себе - зло, и только упертые будут реализовывать их, благо CLR есть.
Но отсутствие скалярных MIN/MAX бесит уже на протяжении 13 лет.
И если CASE на 2 переменных можно переварить, то когда нужно выбрать наименьшее из 3+ полей... оу еее...
И не нужно мне рассказывать про
Код: sql
1.
SELECT MIN( [v] ) FROM ( VALUES ( 1 ), ( 2 ), ( NULL ), ( -1 ) ) t( [v] )

- performance degrade убивает на корню всю красоту этого решения.

При этом внедряются всяческие фичи вроде File Tables, Column Store Indexes, Sparse Columns, Memory Tables, которые реально использует с десяток контор...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вычислить рабочее время для каждого дня в диапазоне дат?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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