2

いくつかの「リソース」の予定を含む予定テーブルがあり、それをクエリして、(特定のリソースについて) 日付範囲内のすべての空き予定スロットを返す必要があります。

これにアプローチする最善の方法は、可能な予定時間の一時テーブルを生成することであると考えていました (予定の長さは 30/60/90 分である可能性があるため、予定の長さはクエリに対して指定されます)。これらの 2 つのレコードセットの交差。つまり、予定テーブルに予定がない日付範囲全体のすべてです。したがって、そのリソースのすべての可能な予定を返します。

または、おそらく-再び-可能な予定の日時のレコードを生成し、実際にすでに予約されている予定を除いて..?

? もちろん、誰かがより簡単なオプションを提案できない限り。

また、可能なテーブル、つまりレコードを含むテーブルなどを生成する方法も完全にはわかりません2010-12-08 09:00, 2010-12-08 10:00,(1時間の予定の場合)...

何か案は?

編集:可能性について漠然とした考えを持っています...

DECLARE @startDate DateTime
DECLARE @EndDate DateTime

set @startDate = '2010-12-08 09:00'
set @endDate = '2010-12-11 09:00';

with mycte as
(
   select cast(@startDate as datetime) DateValue
   union all
   select dateadd(mi,30,DateValue)
   from    mycte   
   where   DateValue <= @endDate
   and datepart(hh, dateadd(mi,30,DateValue)) Between 9 AND 16

)
select DateValue
from    mycte
4

1 に答える 1

1

これは、典型的なギャップと島の問題です。これは基本的に、シーケンス内の欠損値 (ギャップ) を特定する必要がある一般的な問題です。幸いなことに、Manning の書籍、SQL Server MVP Deep Dives から、まさにこのトピックに関する無料のサンプルの章があります。多くの可能なアプローチに関するガイダンスを提供するため、インスピレーションを与えることを願っています.

http://www.manning.com/nielsen/SampleChapter5.pdf

上記の章から引用した、Itzik Ben-Gan による問題の説明を次に示します。

ギャップと島の問題には、シーケンス内の欠落値が含まれます... 関連するシーケンスは、注文日などの一時的なものである場合もあり、非アクティブな期間 (週末、休日) のために欠落しているものもあります。非活動期間を見つけることはギャップ問題の例であり、活動期間を見つけることは島問題の例です。

于 2010-12-08T10:14:08.640 に答える