Sql 无班次表的分班

Sql 无班次表的分班,sql,vb.net,sql-server-2008,time-and-attendance,Sql,Vb.net,Sql Server 2008,Time And Attendance,我有一个表,用于捕获以下格式的最小/最大时间 1 2012-10-30 12:13:07.000 2012-10-30 15:18:50.000 2 2012-10-30 16:13:07.000 2012-10-30 21:18:50.000 我想知道是否有可能为同一用户捕获两组不同的日期时间,如下表所示。这样做的原因是,数据用于管理承包商的出勤情况,这些承包商可以在多个班次中随时进出。也就是说,UID 1可以在12:00打卡,在15:0

我有一个表,用于捕获以下格式的最小/最大时间

1      2012-10-30 12:13:07.000        2012-10-30 15:18:50.000   
2      2012-10-30 16:13:07.000        2012-10-30 21:18:50.000
我想知道是否有可能为同一用户捕获两组不同的日期时间,如下表所示。这样做的原因是,数据用于管理承包商的出勤情况,这些承包商可以在多个班次中随时进出。也就是说,UID 1可以在12:00打卡,在15:00打卡,然后再回来,在18:00打卡,在21:00打卡,他们不按照时间表或轮班表工作

uid    clock                          clock                    Status  
1      2012-10-30 12:00:00.000        2012-10-30 15:00:00.000   regular
1      2012-10-30 18:00:00.000        2012-10-30 21:00:00.000   Split
2      2012-10-30 16:13:07.000        2012-10-30 21:18:50.000   regular

如果您有任何建议,我们将不胜感激。

在不太了解您申请的详细信息的情况下,我认为构建数据结构的最佳方法是让表中的每个记录对应于每个员工的单个打卡/打卡。从这里开始,计算每个员工在给定时间段内的工作时间将变得非常简单。我没有弄错,这听起来很像您在第二个示例中描述的数据,减去Status列

在最简单的示例中,您的表将包含以下列:

UID (INT or uniqueidentifier)
ClockIn (datetime)
ClockOut (datetime)
当员工打卡时,您将在该员工的表中插入一行,并在“打卡”列下及时输入时钟

每个员工打卡时,都会给他们一行

UID     ClockIn                    ClockOut
-------------------------------------------
1       2012-10-30 12:00:00.000    NULL
2       2012-10-30 1:00:00.000     NULL
3       2012-10-30 2:00:00.000     NULL
当员工下班时,应用程序应检索该员工的现有记录,并通过将“下班”列设置为下班时间来更新行

UID     ClockIn                    ClockOut
-------------------------------------------
1       2012-10-30 12:00:00.000    NULL
2       2012-10-30 1:00:00.000     2012-10-30 3:30:00.000
3       2012-10-30 2:00:00.000     NULL
如果员工打卡下班后再回来,他们将获得一个新记录,就像他们当天早些时候打卡一样

UID     ClockIn                    ClockOut
-------------------------------------------
1       2012-10-30 12:00:00.000    NULL
2       2012-10-30 1:00:00.000     2012-10-30 3:30:00.000
3       2012-10-30 2:00:00.000     NULL
2       2012-10-30 4:30:00.000     NULL
希望在这一点上,您能够看到这个相当简单的数据模型是如何具有足够的灵活性来支持大多数标准的计时功能的

您可以通过查找ClockOut为NULL的行来确定谁已打卡 当员工忘记打卡时,你可以有一些处理流程 为迟到或下班打卡的员工编辑打卡。 您可以通过对每个员工的每一行执行DATEDIFF的ClockOut和ClockIn,并将结果相加,来确定每个员工的总工作小时数 在本例中,验证数据的大部分责任将在以后的应用程序中进行。你不会希望有人被多次打卡,或者如果他们还没有打卡,就尝试打卡下班

UID     ClockIn                    ClockOut
-------------------------------------------
1       2012-10-30 12:00:00.000    NULL
2       2012-10-30 1:00:00.000     2012-10-30 3:30:00.000
3       2012-10-30 2:00:00.000     NULL
2       2012-10-30 4:30:00.000     NULL