この質問は、私の最後の質問を参照しています: SQL Server 08:Union over while
私はその質問で説明されたことを実行するためにCTEを書いています(指定された日数にわたって利用可能な時間枠を見つけます。
私はCTEを書いていますが、日付を増やして制限する方法を完全に理解することはできません。現状では、2011-07-30(@ArrivalDate)からのみデータを取得します。 適切にインクリメントする方法と、どこが間違っているのかを誰かに説明してもらえますか?
更新:利用可能なすべてのタイムスロットを取得するためのより良いクエリを考え出しました
(SELECT TS.UKTNN, TS.TimeSlotID, TS.TimeSlotGroupID
FROM FittingCentreTimeSlotGroupTimeSlots TS)
EXCEPT
(Select BFD.UKTNN, BFD.TimeSlotID, BFD.TimeSlotGroupID
From BookedFittingDates BFD)
そして、コメントで要求されたテーブル構造は次のとおりです。
TimeSlotGroup[〜#〜] uktnn [〜#〜]、 TimeSlotGroupID、TimeSlotGroupDesc
TimeSlotGroupTimeSlots[〜#〜] uktnn [〜#〜]、 TimeSlotID、TimeSlotGroupID、TimeSlotDesc
BookedDates[〜#〜] uktnn [〜#〜]、 TimeSlotGroupID、TimeSlotID、日付
これが私の既存のCTEが今どのように見えるかです
Use[DEV_UKTN_DATA]
GO
DECLARE @UKTNN int;
DECLARE @ArrivalDate date;
DECLARE @NumDays int;
DECLARE @LoopDate date;
SET @UKTNN = 7;
SET @ArrivalDate = '2011-07-30';
SET @LoopDate = @ArrivalDate;
SET @NumDays = 2;
WITH GetTimeSlotsOnDays(TimeSlotGroupID, TimeSlotGroupDesc, TimeSlotID, TimeSlotDescription, AdditionalCost, UKTNN, CurrentDate, Distance)
AS
(
SELECT TSG.TimeSlotGroupID,
TSG.TimeSlotGroupDesc,
TS.TimeSlotID,
TS.TimeSlotDescription,
TS.AdditionalCost,
@UKTNN AS UKTNN,
@ArrivalDate as CurrentDate,
0 As Distance
FROM FittingCentreBranchTimeSlotGroups TSG
INNER JOIN FittingCentreTimeSlotGroupTimeSlots TS
ON TSG.TimeSlotGroupID = TS.TimeSlotGroupID AND
TSG.UKTNN = TS.UKTNN
WHERE TSG.UKTNN = @UKTNN AND
TS.UKTNN = @UKTNN AND
TS.TimeSlotGroupID = TSG.TimeSlotGroupID AND
NOT EXISTS(
SELECT *
FROM BookedFittingDates BFD
WHERE BFD.TimeSlotGroupID = TS.TimeSlotGroupID AND
BFD.TimeSlotID = TS.TimeSlotID AND
BFD.UKTNN = @UKTNN AND
BFD.Date = @ArrivalDate)
--@ArrivalDate <= DATEADD(DAY, @NumDays, @ArrivalDate)
UNION ALL --Recursion starts here
SELECT TSG.TimeSlotGroupID,
TSG.TimeSlotGroupDesc,
TS.TimeSlotID,
TS.TimeSlotDescription,
TS.AdditionalCost,
@UKTNN UKTNN,
@ArrivalDate As CurrentDate,
Distance + 1 As Distance
FROM FittingCentreBranchTimeSlotGroups TSG
INNER JOIN FittingCentreTimeSlotGroupTimeSlots TS
ON TSG.TimeSlotGroupID = TS.TimeSlotGroupID AND
TSG.UKTNN = TS.UKTNN
INNER JOIN GetTimeSlotsOnDays as GTSOD
ON GTSOD.CurrentDate = DATEADD(DAY, Distance, @ArrivalDate)
)
SELECT *
FROM GetTimeSlotsOnDays GTSOD
WHERE GTSOD.CurrentDate = @ArrivalDate AND GTSOD.Distance = 0
ORDER BY GTSOD.TimeSlotGroupID ASC, GTSOD.TimeSlotID ASC
GO
私はこれに対する答えを見つけました!
1)目的の日付を含むテーブルを返す関数を作成します
2)日付を使用してタイムスロットのデカルト積を実行します
3)予約日とデカルト積の間の例外を見つけます