拆分班次没有班次时间表

时间:2012-11-23 03:26:58

标签: 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

我想知道是否有可能为同一个用户捕获2个不同的datetime集,如下表所示。这样做的原因是,数据用于管理承包商的出勤情况,这些承包商可以随时进出多班。也就是说,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

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

在不了解应用程序详细信息的情况下,我会说您构建数据的最佳方法是让每个员工的每个记录对应一个“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为空的行
  • 来确定自己的时钟
  • 当empoyees忘记冲出时,你可以有一些处理过程
  • 为钟表迟到的员工编辑拳头。
  • 您可以为每位员工DATEDIFF ClockOutClockIn分别为每位员工确定工作总时数,并总结结果

在此示例中,验证数据的大部分责任将在以后的应用程序中进行。你不希望有人多次被计时,或者如果他们还没有真正打过拳头的话,他们会尝试退出。