2013-12-19 50 views
0

我有一个查询,它会运行一个函数来抓取员工信息。它拉的时间段,将它们组合为特定的某一天,他们运行一个检查,看看Datediff在休息时间查找差异

1)谁没有休息的那一天 2)谁休息了不到30分钟

的第一部分工作正常。它显示了一周中没有休息的7人(全部休息0分钟)。但是,它不显示只需要22分钟休息时间的用户。我相信发生了什么,它是不是完全结合了特定日子的所有时间信息。它只是将那些没有休息的人的信息结合起来。任何帮助?

我的查询是:

SELECT  lEmployeeID, NUM_Hours, CASE WHEN tmp.Break_Time_Minutes < 0 THEN 0 ELSE Break_Time_Minutes END AS Break_Time_Minutes, 
         CASE WHEN tmp.Break_Time_Minutes < 0 THEN 1 ELSE 0 END AS SkippedBreak, sFirstName, sLastName, TotalHours 
FROM   (SELECT  employee.lEmployeeID, employee.sFirstName, employee.sLastName, employee.TotalHours, ROUND(SUM(DATEDIFF(second, employee.dtTimeIn, 
                employee.dtTimeOut)/60.0/60.0), 1) AS NUM_Hours, DATEDIFF(mi, MIN(employee.dtTimeOut), MAX(employee.dtTimeIn)) AS Break_Time_Minutes 
          FROM   dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList) AS employee LEFT OUTER JOIN 
                Employees AS e ON employee.lEmployeeID = e.lEmployeeID 
          WHERE  (employee.TotalHours >= 0) AND (employee.DID IS NOT NULL) OR 
                (employee.DID IS NOT NULL) AND (employee.dtTimeOut IS NULL) 
          GROUP BY employee.lEmployeeID, employee.sLastName, employee.sFirstName, employee.TotalHours, CAST(employee.dtTimeIn AS Datetime)) AS tmp 
WHERE  (NUM_Hours > 6) AND (Break_Time_Minutes < 30) 
+0

您的查询未neccessary complicated.in您的最后一个职位,我建议在你的exisitng查询(最后一篇) ,在同一个查询中用datediff创建一个多列,并且现在显示同样的内容。不需要group by或sum。 – KumarHarsh

+0

我必须合并细分......我只想报告那些休息时间少于30分钟的人,包括那些根本没有参加过的人。我还需要报告没有充分休息的总工作小时数 – Shmewnix

+0

首先您在同一个查询中用datediff创建另一列,之后您将使用GROUP BY employee.lEmployeeID的工作和总计工作组合在一起。这就是为什么我要告诉显示你最后的帖子查询很简单。 – KumarHarsh

回答

0

格式化查询帮助我理解它。

这个问题似乎在计算休息时间。这两种计算如何精确?

  ROUND(SUM(DATEDIFF(second, employee.dtTimeIn, 
          employee.dtTimeOut)/60.0/60.0), 1) AS NUM_Hours, 
     DATEDIFF(mi, MIN(employee.dtTimeIn), MAX(employee.dtTimeOut) 
       ) AS Break_Time_Minutes 

第二个是计算休息时间作为时间的最小值和超时的最大值。据推测,这是员工在那里的总时间。

也许你的意思是:

 MIN(DATEDIFF(mi, employee.dtTimeIn, employee.dtTimeOut) 
     ) AS Break_Time_Minutes 

全格式的查询是:

SELECT lEmployeeID, NUM_Hours, 
     (CASE WHEN tmp.Break_Time_Minutes < 0 THEN 0 ELSE Break_Time_Minutes 
     END) AS Break_Time_Minutes, 
     (CASE WHEN tmp.Break_Time_Minutes < 0 THEN 1 ELSE 0 
     END) AS SkippedBreak, 
     sFirstName, sLastName, TotalHours 
FROM (SELECT employee.lEmployeeID, employee.sFirstName, employee.sLastName, 
      employee.TotalHours, 
      ROUND(SUM(DATEDIFF(second, employee.dtTimeIn, 
           employee.dtTimeOut)/60.0/60.0), 1) AS NUM_Hours, 
      DATEDIFF(mi, MIN(employee.dtTimeIn), MAX(employee.dtTimeOut) 
        ) AS Break_Time_Minutes 
     FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList 
         ) employee LEFT OUTER JOIN 
      Employees e 
      ON employee.lEmployeeID = e.lEmployeeID 
     WHERE (employee.TotalHours >= 0) AND (employee.DID IS NOT NULL) OR 
      (employee.DID IS NOT NULL) AND (employee.dtTimeOut IS NULL) 
     GROUP BY employee.lEmployeeID, employee.sLastName, employee.sFirstName, 
       employee.TotalHours, CAST(employee.dtTimeIn AS Datetime) 
    ) tmp 
WHERE (NUM_Hours > 6) AND (Break_Time_Minutes < 30) 
+0

没有工作“MINDATEDIFF”不是一个内置的函数名称 – Shmewnix

+0

本应该是'min(datediff(...))'。 –

+0

另外,自从我原来的帖子以来,我改变了这个查询,我把这个部分倒过来了。我需要把最短时间从最大时间中减去(这是假设他们休息一下)。例如。如果我在上午7点打卡,请在上午11点休息,然后在上午11:22休息,我休息了22分钟。我需要做这个数学,然后报告异常 – Shmewnix