Получить активные строки от и до диапазона дат, включая границы - PullRequest
1 голос
/ 30 июня 2011

Таблица testTable имеет 4 столбца

  • sessionid int
  • started datetime
  • ended datetime
  • SessionIsRunning bool -будет истинным, если последняя сессия еще не закончилась.Максимально только одна запись может быть истинной в любое время, поскольку может быть запущен максимум один сеанс.Если ни один сеанс не запущен, то все записи имеют это значение как ложное.

Учитывая две даты, скажем fromDate и toDate, как мне получить первый сеанс, который начался в или после fromDate ипоследний сеанс, который закончился toDate или раньше.Сложное условие: если сеанс находится в процессе и он start date >= fromDate, нам это нужно.Я предполагаю, что было бы невозможно получить как минимальный, так и максимальный идентификаторы сеанса в одном выражении sql и сохранить код читабельным и простым в обслуживании.Два отдельных оператора SQL в порядке.один, чтобы получить мин и один, чтобы получить макс.Затем я могу запросить строки, используя от мин до макс.

Последнее утверждение объясняет это по-другому.Получить все сеансы, которые начались или были запущены и закончились или работали между / с датами спасибо

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

После рассмотрения ваших правок и комментариев, касающихся МЕЖДУ, это должно дать вам необходимый набор результатов.Он будет извлекать любую запись, в которой SessionIsRunning = true, а также сеансы, которые начались и закончились в диапазоне дат.

SELECT * FROM testTable tt
WHERE (tt.started >= fromDate AND tt.started < DATEADD(DAY, 1, toDate)
   AND tt.ended >= fromDate AND tt.ended < DATEADD(DAY, 1, toDate))
   OR SessionIsRunning = true
ORDER BY tt.sessionid
1 голос
/ 30 июня 2011

Получение только первого и последнего значения в одном запросе (потому что ваш вопрос заставил меня задуматься, как на самом деле написать это, даже если это не то, что вы на самом деле спрашиваете):

SELECT * FROM
(SELECT TOP 1 * FROM ATable ORDER BY AColumn ASC) first
UNION
SELECT * FROM
(SELECT TOP 1 * FROM ATable ORDER BY AColumn DESC) last
...