簡體   English   中英

使用C#在SQL表中創建“每月時間表/時間表日歷”

[英]Using C# to create a “monthly timetable/schedule calender” in a SQL table

對於上下文,我正在為獸醫診所創建數據庫。

我在Microsoft SQL Server Management Studio 2014中有一個帶有關系模型(schema)的SQL表,如下所示:我想部分預先填充的ScheduleSlot(slloottIdD̲,房間,日期,startTime,endTime,約會ID,staff_id)

  • 約會ID和職員ID是foeign_key,為此“空日歷”的目的可以並且應該為null
  • 發泄診所每周僅開放6天,周日關閉。
  • 每個可能的約會都是半小時。
  • 營業時間為8:00 am-5:00 pm。

我想創建一個日記結構,該日記結構允許您每天定義獸醫可能可用的位置。

例如,我想為2016年5月的所有26個非星期日天生成這樣的內容:

slotId  date        startTime   endTime room    appointment_id  staff_id
1       5/2/2016    8:00        8:30    1       null            null
2       5/2/2016    8:00        8:30    2       null            null
3       5/2/2016    8:00        8:30    3       null            null
4       5/2/2016    8:00        8:30    4       null            null
5       5/2/2016    8:30        9:00    1       null            null
6       5/2/2016    8:30        9:00    2       null            null
7       5/2/2016    8:30        9:00    3       null            null
8       5/2/2016    8:30        9:00    4       null            null
9       5/2/2016    9:00        9:30    1       null            null
10      5/2/2016    9:00        9:30    2       null            null
11      5/2/2016    9:00        9:30    3       null            null
12      5/2/2016    9:30        9:30    4       null            null
...     ...         ...         ...     ...     ...             ...

作為參考,任何月份,以及2016年5月每月應有72個(18個間隔x 4個房間posiblites)插槽,約1872個插槽(72 x 26)。


我可能的解決方案是使用模(循環)檢查i%7 == 0並跳過它? -for循環可以傳遞參數作為第一個日期,並一直工作到月底。

不要這樣做

只是有一個約會表,用於存儲安排約會的時間。

SQL通常不應對業務規則負責。

在將其交給數據庫進行存儲之前,請在中間層或任何要處理業務邏輯的地方進行此操作。

如果在給定的一天中您只有2個約會,那么該天您應該只有2行。 沒有一堆具有所有可用時隙和NULL的行。 那是浪費空間和不必要的開銷。

如果要從數據庫端強制完整性,以確保沒有任何無效數據從數據訪問層通過(例如,工作時間以外的約會或重疊的約會),則可以使用觸發器並檢查檢查是否有效的約束邏輯,或通過執行相同操作的存儲過程發送所有內容。

就像@Patrick所說的那樣不要這樣做 ,因為過一會兒您應該刪除大量垃圾數據后,這種垃圾將給報告帶來麻煩。

因此,如果我是您,我將創建一個用於安排時間的表格,例如房間,持續時間,開始時間,結束時間...。當我想插入新約會時,我嘗試通過時間表規則和最后一次約會。

例如最后一次約會是在2016年5月2日1號房間的13:00,在時間表表中,我知道會議的持續時間是一個半小時,

所以我在5/2/2016 14:30為#1房間創建了新約會

您也可以找到許多解決方案,以最好的方式做到這一點。

如果您確實想用所需的值預填充表,則可以使用此方法

DECLARE @desiredMonth int = 5;
DECLARE @desiredYear int = 2016;

SELECT StartDate, 
DATEADD(minute, 30, StartDate) AS EndDate, 
rooms AS Room 
FROM
(
    SELECT 
    /* Construct StartDate */
    dateadd(minute, minutes, dateadd(hour, hours, dateadd(day, days - 1, dateadd(month, @desiredMonth - 1, dateadd(year, @desiredYear - 1900, 0))))) AS StartDate,
    minutes,
    rooms
    FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31)) AS W(days)
    CROSS JOIN (VALUES (8), (9), (10), (12), (12), (13), (14), (15), (16)) AS X(hours)
    CROSS JOIN (VALUES (00), (30)) AS Y(minutes)
    CROSS JOIN (VALUES (1), (2), (3), (4)) AS Z(rooms)
    /* Check, that only days are included for desired month */
    WHERE DATEPART(m, dateadd(hour, hours, dateadd(day, days - 1, dateadd(month, @desiredMonth - 1, dateadd(year, @desiredYear - 1900, 0))))) = @desiredMonth
) AS SubQuery01

但是我同意其他意見,即通常不應該這樣做。 也許在視圖中使用更好?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM