Я создаю хранимую процедуру, которая создает отчеты на основе данных в базе данных SQL и хранит эти отчеты в отдельной базе данных. Данные, представленные в отчете, представляют собой общее время в диапазоне дат, в котором работал двигатель. Я хочу, чтобы можно было определить, перекрывают ли временные рамки, о которых я сообщаю, предыдущие отчеты на основе дат и времени.
Например, у нас есть следующая таблица:
Row-----Value-----StartDate------------------EndDate
1-------12--------2010-01-21 00:00:00.000----2010-01-21 11:59:99.997
2-------12--------2010-01-22 00:00:00.000----2010-01-22 11:59:99.997
3-------12--------2010-01-22 12:00:00.000----2010-01-22 23:59:99.997
4-------12--------2010-01-23 00:00:00.000----2010-01-23 11:59:99.997
5-------12--------2010-01-24 00:00:00.000----2010-01-24 11:59:99.997
Если бы я вставил в эту таблицу следующие строки:
ВХОД:
1. Value = 12, StartDate = 2010-01-21 6:00:00.000, EndDate = 2010-01-21 17:59:99.997
2. Value = 14, StartDate = 2010-01-21 11:00:00.000, EndDate = 2010-01-22 0:59:99.997
3. Value = 13, StartDate = 2010-01-20 12:00:00.000, EndDate = 2010-01-21 0:59:99.997
ВЫВОД:
1. Value = 6, StartDate = 2010-01-21 12:00:00.000, EndDate = 2010-01-21 17:59:99.997
2. Value = 12, StartDate = 2010-01-21 12:00:00.000, EndDate = 2010-01-21 23:59:99.997
3. Value = 12, StartDate = 2010-01-20 12:00:00.000, EndDate = 2010-01-20 23:59:99.997
Как видите, даты начала / окончания корректируются, а дополнительное время удаляется. Важно отметить, что результаты будут получены, если будет добавлена только 1 строка, а не все 3 одновременно.
Мне кажется, я слишком долго смотрел на проблему и не вижу леса за деревьями. Тем не менее, в процессе написания этого вопроса у меня появилось еще несколько идей, чтобы попробовать, а также внести изменения в мои таблицы, но все же хотелось бы посмотреть, как вы, ребята, подойдете к этой ситуации.
Вопрос: Какой запрос вы бы использовали, чтобы обнаружить, что начальная и конечная дата за пределами круга колеблется между несколькими строками?
Ура!
* Редактировать *
Чтобы пояснить данные моего примера, значение = 6 для вывода 1 происходит из-за того, что оно конфликтует со строкой 1 на 6 часов. Ниже приведены изменения для каждого входа.
- Конфликт ввода со строкой 1, перемещение начального времени ввода в EndDate строки + 3 мс и запроса (временной интервал = 6 часов).
- Входные конфликты со строками 1 и 2, смещение времени начала к конечной дате строки 1 + 3 мс и времени окончания к начальной дате строки 2 - 3 мс. (Промежуток времени = 12 часов)
- Входные конфликты со строкой 1, время окончания перемещается в EndDate строки 1 - 3 мс. (Timepsan = 12 часов).
Хотя в этом примере показаны только периоды в течение 1 дня, возможен случай, когда периоды охватывают несколько дней.