2016-05-02 35 views
2

對於上下文,我爲獸醫診所創建數據庫。使用C#在SQL表中創建「每月時間表/計劃日曆」

我在Microsoft SQL Server Management Studio中2014年關係模式(schema)SQL表如下:ScheduleSlot(slotID用於,室內,日期,開始時間,結束時間,appointment_id,staff_id),我想部分預填。

  • appointment_id和staff_id是foeign_keys,可以而且應該爲null這個「空日曆」
  • 通風診所的目的僅僅是開放,每週6天,週日關閉。
  • 每個可能的約會是半小時。
  • 營業時間爲上午8:00至下午5:00。

我想創建一個日記結構,允許您在每一天都定義一個獸醫可能可用的插槽。

例如我想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 
...  ...   ...   ...  ...  ...    ... 

作爲參考應該有每天72(18周的間隔×4室posiblites)插槽,用於任何月份,以及2016年5月份約1872個插槽(72 x 26)。


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

+0

也許是更好的使用'datename'或'datepart'這樣的事件作爲天識別 – MrPixel6

+0

如果你想通過C#創建記錄,你可以檢查DateTime.DayOfWeek屬性。 https://msdn.microsoft.com/en-us/library/system.datetime.dayofweek(v=vs.110).aspx –

回答

3

不要這樣做

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

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

在您的中間層或您處理業務邏輯的任何位置執行此操作,然後將其交給數據庫進行存儲。

如果在任何給定的日子裏,你只有2次約會,那麼你應該只有2行的那一天。不是一堆具有所有可用時隙和NULL的行。這是浪費空間和不必要的開銷。

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

0

由於@帕特里克說不要這樣做,因爲過了一段時間你有很多垃圾數據,你應該刪除它。這種垃圾會在報告中造成一些麻煩。所以,如果我是你,我會創建一個表格,像房間,時長,開始時間,結束時間...... 當我想要插入新的約會時,我嘗試按計劃規則和上次約會創建新的約會。

例如最後任命是在2016年5月2日13:00在房間#1, 和計劃表,我知道會議的持續時間爲半小時,

,所以我創建新的約會對於房間#1在5/2/2016在14:30

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

0

如果你真的想預填一個表所需的值,你可以使用這個

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 

但我同意對方的意見,通常你不應該做這樣的東西。也許在視圖中使用會更好?