私たちの会社で行っているラップトップの更新のための予約システムを書いています。どの日に利用可能なスロットがあるかを計算し、それらをカレンダー コントロールにレンダリングできるようにする必要があります (つまり、ある日に利用可能な日がある場合は選択可能であり、そうでない場合は選択できません。
ロジックは次のとおりです。
- 技術者は 1 日に 3 台のラップトップを構築できます。
- いつでも 1 人、2 人、または 3 人の技術者が対応可能です。
- テーブルにはすでに行われた予約が保持されます
1 日あたりの利用可能なスロットの総数は (疑似コードで):
((laptops per day) * (technicians available)) - slots already booked
私の質問は、これを導出する最も効率的な方法は何ですか? 利用可能なスロットを含む日付のテーブルを返す関数を使用して、SQL 側で行うのが最善だと思います。(少なくとも 1 つのスロットが使用可能である限り、いくつあってもかまいません。)
これまでのところ、すべて頭に浮かぶことができます。私が立ち往生しているビットは、少し非効率的であるため、すべての可能な日付のテーブルを持ちたくないということです。私ができるようにしたいのは、現在から 3 か月先の日付範囲を効果的に反復し、そこから利用可能な日付を計算することです。
これは C# で行うこともできますが、可能な限り毎日 SQL サーバーにアクセスし続ける必要があるため、効率が悪いと思います。SQL側で行う方が良いようですが、この方法で可能な日付を反復する方法がわかりません。
これまでのソリューション
@Chris の方法を使用して、スロットの本が設定された最大値を超えない日付の範囲を取得できます。
DECLARE @startDate DATE
DECLARE @endDate DATE
SET @startDate = GETDATE()
SET @endDate = DATEADD(m,3,@startDate)
;
WITH dates(Date) AS
(
SELECT @startdate as Date
UNION ALL
SELECT DATEADD(d,1,[Date])
FROM dates
WHERE DATE < @enddate
)
SELECT Date
FROM dates
EXCEPT
SELECT date
FROM tl_sb_booking
GROUP BY date
HAVING COUNT(date) < 3
これは、任意の最大 3 つの予約を設定しているだけです。次のステップは、技術者の可用性を追加することです!