我的场景:我有一个网站,上面有活动日历和一个供访客预订访问的预订表格,让我们说一些花园 xyz。当在这个花园里举行活动时,游客不得参观花园。
活动日历由管理层维护,如果活动在 2012 年 6 月 16 日至 2012 年 6 月 20 日期间举行,并且对于此活动,他们将关闭花园,不接待任何访客。
在预订的另一边,我必须在下拉列表或一些弹出日历中显示访客的可用日期,这将阻止在活动日历中预订的日期。
事件数据存储在 Event_Calender 表中,该表具有以下字段
Event_ID
Event_Name
Event_Start_Date
Event_End_Date
Event_Start_Time
Event_End_Time
Event_Block_Visitor
重要的是,任何一天只允许 50 名游客参观花园 ,游客数据存储在 Visitor_Booking Table 表结构中
Booking_ID
Booking_Date
Visitor_Name
No_Of_Visitor
EMail_ID
Contact_No
预订表格有一个下拉菜单,应显示可用日期 基于一个
- 未在活动日历中预订或阻止的日期
- 如果 6 月 28 日已经预订了 50 位访客,则 6 月 28 日不应出现在可用预订日期表中。
我的表结构有点复杂,然后在示例中显示。
如果有人能以最好的方式做到这一点,我将不胜感激。
我正在尝试通过Booked_Dates
使用一个查询和其他查询生成我正在尝试从表Event_Calender Table
中生成具有 50 个预订的预订日期。Visitor_Booking
这会给我所有预订的日期。现在我有了基于此被阻止的日期,我如何生成可供访问的日期。
CTE 查询以从偶数日历生成预订日期
注意:查询结果的一个问题是与查询获取早于指定日期的结果相关的结果。这是由于运算符优先级
到目前为止的脚本:
;WITH Calendar
AS (SELECT EventID,
EventTitle,
EventStartDate,
EventEndDate,
EventEnumDays,
EventRecurring,
EventStartTime,
EventEndTime,
EventStartDate AS PlannedDate,
EventType,
EventCategory
FROM EventCalender
WHERE EventActive = 1
AND LanguageID = 1
AND EventBlockDate = 1
UNION ALL
SELECT EventID,
EventTitle,
EventStartDate,
EventEndDate,
EventEnumDays,
EventRecurring,
EventStartTime,
EventEndTime,
Dateadd(dd, 1, PlannedDate),
EventType,
EventCategory
FROM Calendar
WHERE EventRecurring = 1
AND Dateadd(dd, 1, PlannedDate) <= EventEndDate)
SELECT EventID,
EventStartDate,
EventEndDate,
PlannedDate AS [EventDates],
EventStartTime,
EventEndTime,
Cast(EventStartDate AS DATETIME) + '' + Cast(EventStartTime AS DATETIME) AS DT,
EventTitle,
EventType,
EventCategory,
Datename(weekday, PlannedDate) AS [WEEKDAY],
Getdate() AS [YYYY/MM/DD]
FROM Calendar
WHERE PlannedDate >= Getdate()
AND ',' + EventEnumDays + ',' LIKE '%,' + Cast(Datepart(dw, PlannedDate) AS CHAR(1)) + ',%'
OR EventEnumDays IS NULL
ORDER BY EventID,
PlannedDate
OPTION (maxrecursion 0)