1

这是我所拥有的:

SELECT   Count(*) AS cnt 
FROM     tblOccurrence AS x 
WHERE    (((x.OccurrenceDate) Between DateAdd('m',-6,Date()) And Date()) 
         AND ((Exists ( SELECT * 
                        FROM tblOccurrence AS y 
                        WHERE y.TechID = x.TechID AND DATEADD ('d', -1, x.[OccurrenceDate]) = y.[OccurrenceDate]))=False) 
                        AND ((x.TechID)= " & Me.tbxTechID.Text & ")) 
GROUP BY x.TechID;

这用于计算员工缺勤的“发生”,如果员工无故缺勤 1 天,则为 1 次。如果他们连续 5 天没有理由,这仍然是一次。

直到有人指出,如果员工有 MF 轮班并在周五和周一打电话,这只会发生 1 次。为了让事情变得更加艰难,我们的员工轮班非常大(MF,周二至周六,周日至周一,M-周二和周五至周六等)......所以我建立了一张桌子,可以容纳所有不同的班次(大约其中 8 个)有 9 列:

ID - ShiftName - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday

ShiftName 是一个带有简短描述的文本字段(Mon-Fri、Tue-Fri、Sun-Thu 等),然后是一周中的几天的 Yes/No 字段。然后复选标记是预定的日期。

所以我希望每个人都对两件事提出意见,

  1. 这是捕捉我需要捕捉的东西的“好”方式吗?
  2. 考虑到周末无故缺勤但计为 1 次,该 SQL 语句将如何更改以使出现次数正确?
4

1 回答 1

0

在表 tblOccurrence 中再增加一列会更容易实现。调用这个新列,即:occuranceCounter。使用触发器填充此列。每当您在 tblOccurence 中插入新行时,此触发器都会填充occuranceCounter 列。

触发逻辑:检查员工的班次,检查上次缺勤日期,当前缺勤日期,如果根据员工班次连续天数,则保持发生计数与上次缺勤发生计数相同,否则将发生计数加一。

如果员工轮班数据随时间发生变化,那么添加员工轮班历史表会很有帮助。

于 2012-08-28T01:45:00.120 回答