作为上下文,我正在为 vert 诊所创建一个数据库。
我在 Microsoft SQL Server Management studio 2014 中有一个 SQL 表,其关系模型(架构)如下:ScheduleSlot(s̲l̲o̲t̲I̲D̲, room, date, startTime, endTime, Appointment_id, Staff_id)喜欢部分预填充。
- appointment_id 和 Staff_id 是 foeign_key,对于此“空日历”来说,它们可以而且应该为 null
- 通风诊所每周仅开放 6 天,周日休息。
- 每次可能的预约时间为半小时。
- 工作时间为上午 8:00 至下午 5:00。
我想创建一个日记结构,让您可以每天定义 vert 可能有空的时间段。
例如,我想为 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 个间隔 x 4 个房间)的空位,2016 年 5 月大约有 1872 个空位 (72 x 26)。
我可能的解决方案是使用模数(循环)来检查 i % 7 == 0 是否并跳过它? - for 循环可以传递一个参数作为第一个日期,并一直工作到月底。
最佳答案
不要这样做。
只要有一个约会表来存储安排约会的时间即可。
SQL 通常不应该负责业务规则。
在将业务逻辑交给数据库进行存储之前,请在中间层或处理业务逻辑的任何位置执行此操作。
如果在任何一天,您只有 2 个约会,那么当天您应该只有 2 行。不是一堆包含所有可用时隙和 NULL 的行。这是浪费空间和不必要的开销。
如果您想从数据库端强制实现完整性,以确保数据访问层不会传递任何无效内容(例如工作时间之外的约会或重叠约会),您可以使用触发器并检查约束检查有效逻辑,或通过执行相同操作的存储过程发送所有内容。
关于c# - 使用C#在SQL表中创建 "monthly timetable/schedule calender",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36977713/