日付範囲から日付が連続しているかどうかを見つける最良の方法を探しています(可能な場合はカーソルや重い関数を避けようとしています)。非連続範囲から日付を検索
私はホテルのゲストが出入りする(チェックイン、チェックアウト)と言います。私は特定のゲストが滞在した日付を見つけたいです45th夜私たちと。私たちが使用するデータベースは、なるようにデータが記録されます。ここでは
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')
これまでのところ私は一時テーブルとそのようなクレイジーなものを持つ関数を伴う解決策を考えることができ、私は感じています私はそれを考えるのと同じように。
ありがとうございます。
EDIT: @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
私は、MySQLと同様の(しかし異なる)問題に取り組んできました。そのトリックは、レコードが始まる前の日付から終了した後の数年までの各日付の行を持つ別のテーブルを持つことでした。あなたはその2つを結合し、滞在中に日付が落ちる所与の値(例えば「1」)を作成することができます。次に、結合されたデータセットから、指定された値を持つ45行目を探します。もちろん、SQL Server固有の回答が良いでしょう; – Purpletoucan
「EndDate」は、クライアントが最後の夜に滞在した日付です。本当のチェックアウト日だと思った。今日は正午にチェックアウトすると、夜間は確かに滞在しないので、今日はスクリプトで数えてはいけません。しかし、それはそうではないように思われる、私は理解する。 –
@Andriy M:そうです。最後の日は最後の夜です。私のアプリは本当にホテル滞在ではありません、おそらく別のシナリオを使用する必要があります。再度、感謝します。 – AGoodDisplayName