在不太了解您的应用程序细节的情况下,我会说您构建数据的最佳方式是让您的表中的每条记录对应于每个员工的单个“Punch In / Punch Out”。从那里开始,计算每个员工在给定时间段内的工作时间将非常简单。我没记错,这听起来很像您在第二个示例中描述要布置的数据的方式(减去Status
列)。
在最简单的示例中,您的表将具有以下列:
UID (INT or uniqueidentifier)
ClockIn (datetime)
ClockOut (datetime)
当员工打卡时,您将在该员工的表中插入一行并将时钟放在该ClockIn
列下。
UID ClockIn ClockOut
-------------------------------------------
1 2012-10-30 12:00:00.000 NULL
当每个员工打卡时,他们每个人都会被安排一排
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
当员工下班时,您的应用程序应通过将列设置为下班时间来检索该员工的现有记录和UPDATE
行ClockOut
。
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的行来确定谁打卡
- 当员工忘记打卡时,您可以有某种处理流程
- 为迟到或迟到的员工编辑打卡。
- 您可以通过对每个员工的每一行进行 a 和 ,并对结果求和来确定每个员工的
DATEDIFF
总ClockOut
工作ClockIn
时间
在此示例中,验证数据的大部分责任将在您的应用程序中进行。您不希望某人被打卡多次,或者如果他们还没有真正打卡,就尝试打卡。