У меня проблема, я ее решу, но я написал длинную процедуру, и я не могу быть уверен, что она охватывает все возможные случаи.
Проблема:
Если у меня есть основной интервал времени (From A to B
) и время вторичного интервала (много или нет)
(`From X to Y AND From X` to Y` AND X`` to Y`` AND ....`)
Я хочу СУММ все части интервала времени Main Main (AB) из в минутах в эффективном и наименьшем числе условий (процедура SQL-сервера и метод С#)?
Например: если мой основной интервал От 02:00 to 10:30
И скажем один вторичный интервал From 04:00 to 08:00
Теперь я хочу получить этот результат: ((04:00 - 02:00) + (10:30 -08:00))* 60
Пример с графиком:
в первом случае результат будет:
((X-A) + (B-Y)) * 60
и это будет сложнее, если у меня много вторичных периодов.
Примечание:
Может быть перекрытие между вторичными интервалами, происходящее только тогда, когда мне приходится сравнивать основной период [A, B] с UNION не более двух параллельных множеств вторичных интервалов. Первый набор имеет чтобы содержать только один вторичный интервал, а второй набор содержит (много или нет) вторичных интервалов. Например, на графике, сравнивающем [A,B]
с (набор 2,5
), первый набор (2)
состоит из одного вторичного интервала и второй набор (5)
состоит из трех вторичных интервалов. и это самый худший случай, с которым мне нужно справиться.
Например:
ЕСЛИ мой основной интервал [15:00,19:40]
и у меня есть два набора вторичных интервалов. Согласно моему правилу хотя бы один из этих множеств должен состоять из одного вторичного интервала.
скажем, первый набор [11:00 ,16:00]
а второй набор состоит из двух вторичных интервалов [10:00,15:00],[16:30,17:45]
Теперь я хочу получить результат (16:30 -16:00) +(19:40 -17:45)
Согласно комментариям:
Моя таблица такова:
Первая таблица содержит вторичные периоды, не более двух наборов вторичных периодов в одну и ту же дату для конкретного сотрудника. первый набор содержит только один вторичный период в рабочий день (W)
[work_st,work_end]
, и этот набор будет пустым, если день недели [E]
и в этом случае не будет перекрываться между вторичными периодами. а второй набор может содержать много вторичных периодов в ту же дату [check_in,check_out]
, потому что сотрудник может проверять несколько раз в тот же день.
emp_num day_date work_st work_end check_in check_out day_state
547 2015-4-1 08:00 16:00 07:45 12:10 W
547 2015-4-1 08:00 16:00 12:45 17:24 W
547 2015-4-2 00:00 00:00 07:11 13:11 E
Вторая таблица содержит основной период [A,B]
и это один период для этого сотрудника в этот день (одна запись)
emp_num day_date mission_in mission_out
547 2015-4-1 15:00 21:30
547 2015-4-2 8:00 14:00
В предыдущем примере, если у меня есть требуемая процедура или метод, эта процедура должна принимать два параметра:
- Дата
- emp_num
в предыдущем примере это должно быть как ('2015-4-1' ,547)
Согласно моему объяснению:
-
Основной период (период действия миссии)
[A,B]
из второй таблицы: Должен быть только один период в эту дату для этого сотрудника[15:00,21:30]
-
Вторичный период для прошедшей даты
('2015-4-1')
для этого сотрудника был двумя наборы вторичных периодов (наихудший случай) из первой таблицыПервый набор должен содержать только один вторичный период (или ноль периоды)
[08:00,16:00]
второй набор может содержать много вторичных периоды (или нулевые периоды)[07:45,12:10]
,[12:45,17:24]
Выход должен быть [17: 24,21: 30] преобразован в минуты
Примечание
all day_date,mission_in,mission_out,work_st,work_end,check_in,check_out
являются полями datetime
, но я просто поставлю время в примере для упрощения, я хочу игнорировать часть даты, кроме day_date
, потому что это дата, которую я вычисляю на основе в дополнение к emp_num
.