0

我的场景:我有一个网站,上面有活动日历和一个供访客预订访问的预订表格,让我们说一些花园 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

预订表格有一个下拉菜单,应显示可用日期 基于一个

  1. 未在活动日历中预订或阻止的日期
  2. 如果 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)
4

1 回答 1

0
  1. 获取花园为活动预订的日期
  2. 获取花园已达到完全访问容量的日期(==50)

  3. 结合 1 和 2 个结果

  4. 选择日历以显示/选择预订/访问日期
  5. 在日历的加载/月份更改事件中,以某种方式禁用在步骤 3 中收到的日期

请参阅此示例代码:

   static List<DateTime> lstBookedDates;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            lstBookedDates = new List<DateTime>();
            lstBookedDates.Add(DateTime.Today);
            lstBookedDates.Add(DateTime.Today.AddDays(2));
            lstBookedDates.Add(DateTime.Today.AddDays(-2));
            lstBookedDates.Add(DateTime.Today.AddMonths(1));
            lstBookedDates.Add(DateTime.Today.AddMonths(1).AddDays(2));
        }
    }

    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (lstBookedDates.Where(a=> e.Day.Date.ToShortDateString().Equals(a.Date.ToShortDateString())).Count()>0)
        {
            foreach (Control c in e.Cell.Controls)
            {
                if (typeof(LiteralControl) == c.GetType())
                {

                    LiteralControl c1 = (LiteralControl)c;
                    c1.Text = "";
                }
            }
            e.Cell.BackColor = System.Drawing.Color.Gray;
            e.Cell.ToolTip = "Booking full";
            e.Cell.Enabled = false;

        }        
    }
于 2012-06-18T09:05:51.933 回答