C# 使用C“创建一个”;“每月时间表/时间表日历”;在SQL表中

C# 使用C“创建一个”;“每月时间表/时间表日历”;在SQL表中,c#,sql-server,C#,Sql Server,作为上下文,我正在为兽医诊所创建一个数据库 我在Microsoft SQL Server Management studio 2014中有一个SQL表,其关系模型(模式)如下:ScheduleSlot(s̲l̲o̲t̲I̲D̲,room,date,startTime,endTime,appointment̲id,staff̲id),我想部分预填充 约会id和工作人员id是一对签名密钥,在本“空日历”中可以且应该为空。 通风诊所每周只开放6天,周日关闭 每个可能的约会时间为半小时 营业时间为上午

作为上下文,我正在为兽医诊所创建一个数据库

我在Microsoft SQL Server Management studio 2014中有一个SQL表,其关系模型(模式)如下:ScheduleSlot(s̲l̲o̲t̲I̲D̲,room,date,startTime,endTime,appointment̲id,staff̲id),我想部分预填充

  • 约会id和工作人员id是一对签名密钥,在本“空日历”中可以且应该为空。
  • 通风诊所每周只开放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个间隔x 4个房间位置)插槽,2016年5月大约有1872个插槽(72 x 26)


我可能的解决方案是使用一个模(循环)来检查i%7==0并跳过它for循环可以作为第一个日期传递一个参数,并一直工作到月底。

不要这样做

只要有一个预约表,可以存储预约安排的时间

SQL通常不应对业务规则负责

在将业务逻辑交给数据库存储之前,在中间层或处理业务逻辑的任何位置执行此操作

如果在任何给定的一天,您只有2个约会,那么当天您应该只有2行。不是一堆包含所有可用时隙和空值的行。这是浪费空间和不必要的开销

如果要从数据库端强制实现完整性,以确保数据访问层中没有任何无效内容(如工作时间以外的约会或重叠约会),可以使用触发器和检查约束来检查有效逻辑,或者通过一个与之相同的存储过程发送所有数据。

正如@Patrick所说的,不要这样做,因为过一段时间你会有很多垃圾数据,你应该删除它们。这种垃圾会给报告带来一些麻烦

所以,如果我是你,我会创建一个表来安排房间、持续时间、开始时间、结束时间等等,。。。 当我想插入新约会时,我会尝试根据日程表规则和最后一次约会创建新约会

例如,最后一次预约是2016年5月2日13:00在1号房间, 在时间表中我知道会议的时间是半小时

因此,我在2016年5月2日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

但我同意其他观点,通常你不应该做这样的事情。也许在视图中使用它更好?

也许使用诸如
datename
datepart
之类的东西来进行日标识更好如果您想通过c创建记录,您可以检查
DateTime.DayOfWeek
属性。