Я сталкиваюсь с препятствием на пути к более серьезной проблеме.
В рамках большого запроса мне нужно решить проблему «ночного сторожа».
У меня есть таблица с изменениями графика как таковыми:
ID | Start | End
1 | 2009-1-1 06:00 | 2009-1-1 14:00
2 | 2009-1-1 10:00 | 2009-1-1 18:00
3 | 2009-2-1 20:00 | 2009-2-2 04:00
4 | 2009-2-2 06:00 | 2009-2-2 14:00
Как часть запроса, мне нужно определить, есть ли хотя бы один сторож в комнате постоянно в течение заданного промежутка времени.
Таким образом, если я указал диапазон от 2009-1-1 06:00
до 2009-1-1 12:00
, результат будет верным, потому что сдвиги 1 и 2 объединяются, чтобы покрыть этот период времени - фактически любое число смен может быть объединено в цепочку, чтобы поддерживать наблюдение. Однако, если я проверил 2009-2-1 22:00
до 2009-1-2 10:00
, результат будет ложным, потому что между 4 и 6 утра следующего дня будет перерыв.
Я хотел бы реализовать это либо в LINQ, либо как пользовательскую функцию в SQL Server (2005), поскольку в обоих случаях это лишь часть логики более крупного запроса, который должен бегать, чтобы определить элементы, которые требуют внимания. Реальный набор данных включает в себя около ста сменных записей, пересекающих любой заданный период времени, но не всегда охватывающих весь диапазон.
Самое близкое, что я нашел, это
Как сгруппировать ранжированные значения с помощью SQL Server
для диапазонов номеров, однако это зависит от каждого диапазона, заканчивающегося непосредственно перед началом следующего диапазона. Если бы я мог создать такой же единый вид часов, принимая во внимание только перекрывающиеся часы, то было бы тривиально проверить, было ли охвачено определенное время. Единый вид будет выглядеть так:
Start | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00
Примечание: все это было бы относительно легко реализовать, просто потянув все данные и запустив некоторый ручной цикл, однако это текущая система, и она довольно медленная из-за количества смен и количества времени диапазоны, которые должны быть проверены.