2010-10-04 179 views
1

alt text需要帮助计算工作时间

的路上我设计我的工作表不帮我轻松地计算工时。

快照中的输出已从多个表中收集。

不要担心setDate和timeEntered格式。

SetDate表示工作日。 tsTypeTitle表示班次的类型,是午餐时间等。 timeEntered表示实际时间。

setDate将不得不被修剪为只有Date和timeEntered应该只显示时间 - 这将在稍后处理,不必担心。

我需要抓住Shift Started和Shift End之间的区别,所以我可以计算工资。

这里是我的情况下,查询你想看看它:

SELECT TimeSheet.setDate, TimeSheetType.tsTypeTitle, TimeSheetDetail.timeEntered 
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
     ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID 
    INNER JOIN TimeSheetType 
     ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID 
+0

我记得在一家保险公司实现这一点,我之前的工作....但计算不是在SQL存储过程作为公司的政策(如强制-30分钟午餐)必须从另一台服务器的另一个SQL表中检索。 – 2010-10-04 16:58:30

回答

1

假设每个人都有相同的4个事件(移动开始/结束,午餐开始/结束),每天,你可以这样做这个。很明显,我已经为您的TimeSheetType ID值做了假设。在您的版本中替换适当的ID。

SELECT t.TimeSheetID, DATEDIFF(HOUR, tsd1.timeEntered, tsd4.timeEntered) - DATEDIFF(HOUR, tsd2.timeEntered, tsd3.timeEntered) as WorkingHours 
    FROM TimeSheet t 
     INNER JOIN TimeSheetDetail tsd1 
      ON t.timeSheetID = tsd1.timeSheetID 
       and tsd1.timeSheetTypeID = 1 /* Shift Started */ 
     INNER JOIN TimeSheetDetail tsd2 
      ON t.timeSheetID = tsd2.timeSheetID 
       and tsd2.timeSheetTypeID = 2 /* Lunch Started */ 
     INNER JOIN TimeSheetDetail tsd3 
      ON t.timeSheetID = tsd3.timeSheetID 
       and tsd3.timeSheetTypeID = 3 /* Lunch Ended */ 
     INNER JOIN TimeSheetDetail tsd4 
      ON t.timeSheetID = tsd4.timeSheetID 
       and tsd4.timeSheetTypeID = 4 /* Shift Ended */ 
+0

智能解决方案...... – user311509 2010-10-04 20:39:30

1

如果你必须在数据库中这样做,我建议编写一个存储过程来计算工作时间。否则,我认为在数据库之外处理这种业务逻辑比较明智,就像连接到数据库的应用程序一样。

看看您提供的设计,您似乎缺少与存储时间表数据相对应的用户或个人的唯一标识符。即使您目前只为单个用户/人存储数据,唯一标识符也是必需的。如果您需要为更多用户/人员存储数据,则拥有唯一标识符可以实现这一点。

0

时间表明细表通常会包含人员ID。为了简单起见,我想这已经被省略了。

假设对于任何给定的一天,对于移位入门,午餐开始,午餐结束和轮班结束(按该顺序), 中的每一个将总是有且仅有一个事件,午餐应该从总时数中排除,有没有其他的事件类型,尝试:

with 
(SELECT TimeSheet.setDate, 
     TimeSheetType.tsTypeTitle, 
     TimeSheetDetail.timeEntered, 
     convert(datetime,convert(varchar(10),TimeSheetDetail.timeEntered,112),112) dayEntered 
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
     ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID 
    INNER JOIN TimeSheetType 
     ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID) 
as TS 
select dayEntered, 
     datediff(ss,max(case when tsTypeTitle = 'Shift Started' then timeEntered end), 
        max(case when tsTypeTitle = 'Shift Ended' then timeEntered end)) - 
     datediff(ss,max(case when tsTypeTitle = 'Lunch Started' then timeEntered end), 
        max(case when tsTypeTitle = 'Lunch Ended' then timeEntered end)) daysSeconds 
from TS 
group by dayEntered 
+0

感谢您的帮助! ... – user311509 2010-10-04 20:42:49