Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вычислить рабочее время для каждого дня в диапазоне дат? / 11 сообщений из 11, страница 1 из 1
10.01.2018, 14:27
    #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
10.01.2018, 14:32
    #39581743
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вычислить рабочее время для каждого дня в диапазоне дат?
Создай (возможно, динамически) таблицу рабочего времени по дням, заведомо перекрывающую весь диапазон задачи - и всё станет легко и просто.
...
Рейтинг: 0 / 0
10.01.2018, 14:38
    #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
10.01.2018, 14:43
    #39581750
petre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вычислить рабочее время для каждого дня в диапазоне дат?
MinistrBob,
Попробуйте сначала правильно расставить временные интервалы:
Наверное работы были начаты 27.11 а закончены 30.11.
Из этого и получаем, что 27-го необходимо находить длительность период с 10:37:59 до 18:00, а 30.11 - с 9:00 до 16:02:58 .
Ну а дальше календарь рабочих дней поможет.
...
Рейтинг: 0 / 0
10.01.2018, 14:46
    #39581753
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вычислить рабочее время для каждого дня в диапазоне дат?
MinistrBobЭто типа такой?Подойдёт...
...
Рейтинг: 0 / 0
10.01.2018, 14:59
    #39581767
MinistrBob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вычислить рабочее время для каждого дня в диапазоне дат?
petre,

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

А как их объединить, я чего-то не догоняю?
...
Рейтинг: 0 / 0
10.01.2018, 15:06
    #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
10.01.2018, 15:10
    #39581784
MinistrBob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вычислить рабочее время для каждого дня в диапазоне дат?
petre,

Ооо, спасибо, буду пробовать.
...
Рейтинг: 0 / 0
10.01.2018, 15:51
    #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
10.01.2018, 18:26
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вычислить рабочее время для каждого дня в диапазоне дат? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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