Transact-SQL: определение границ даты в нескольких строках - PullRequest
3 голосов
/ 02 февраля 2010

Я создаю хранимую процедуру, которая создает отчеты на основе данных в базе данных 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. Конфликт ввода со строкой 1, перемещение начального времени ввода в EndDate строки + 3 мс и запроса (временной интервал = 6 часов).
  2. Входные конфликты со строками 1 и 2, смещение времени начала к конечной дате строки 1 + 3 мс и времени окончания к начальной дате строки 2 - 3 мс. (Промежуток времени = 12 часов)
  3. Входные конфликты со строкой 1, время окончания перемещается в EndDate строки 1 - 3 мс. (Timepsan = 12 часов).

Хотя в этом примере показаны только периоды в течение 1 дня, возможен случай, когда периоды охватывают несколько дней.

1 Ответ

2 голосов
/ 02 февраля 2010

Чтобы найти перекрытия, учтите, что в перекрывающихся строках обе StartDates должны появляться перед любой EndDate.

Так что вы должны быть в состоянии сделать что-то вроде:

select *
from yourTable t1
  join
  yourTable t2
   on  t2.StartDate < t1.EndDate
   and t1.StartDate < t2.EndDate

Возможно, вы захотите убедиться, что у вас нет строки, где StartDate> EndDate, используя проверочное ограничение. В противном случае, включите:

   and t1.StartDate < t1.EndDate
   and t2.StartDate < t2.EndDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...