Я ищу, чтобы найти лучший способ найти дату из диапазонов дат, которые могут быть или не быть смежными (я пытаюсь избежать курсора или тяжелой функции, если это возможно).
Допустим, у меня есть гости отеля, которые приходят и уходят (заезд, выезд). Я хочу найти дату, когда какой-то гость провел у нас 45 ночь. База данных, которую мы используем, записывает данные так:
Create Table #GuestLog(
ClientId int,
StartDate DateTime,
EndDate DateTime)
Вот некоторые данные
Insert Into #GuestLog Values(1, '01/01/2010', '01/10/2010')
Insert Into #GuestLog Values(1, '01/16/2010', '01/29/2010')
Insert Into #GuestLog Values(1, '02/13/2010', '02/26/2010')
Insert Into #GuestLog Values(1, '04/05/2010', '06/01/2010')
Insert Into #GuestLog Values(1, '07/01/2010', '07/21/2010')
Пока что я могу думать только о решениях, которые включают в себя функции с временными таблицами и тому подобными сумасшедшими вещами, я чувствую, что я слишком много думаю об этом.
Спасибо, заранее.
РЕДАКТИРОВАТЬ: небольшой мод решения @Andriy M.
DECLARE @ClientID int, @NightNo int;
SET @ClientID = 1;
SET @NightNo = 45;
SELECT *
FROM ( SELECT gl.ClientId
, Date = gl.StartDate + v.number - 1
, rownum = ROW_NUMBER() OVER ( PARTITION BY gl.ClientId ORDER BY gl.StartDate, v.Number)
FROM #GuestLog gl
INNER JOIN master..spt_values v ON v.type = 'P'
AND v.number BETWEEN 1 AND gl.EndDate - gl.StartDate + 1) as s //--added "+ 1"
WHERE ClientId = @ClientId
AND rownum = @NightNo