Sql 总工作时间

Sql 总工作时间,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个包含上述信息的日志表。我有一个查询来计算每个员工的每日工作时间,并将其存储在另一个数据库的十进制字段中。问题在于,会议记录已关闭,如果员工在同一天内重复一次,则会增加时间。我希望它只解释第一个好的punchin/punchout log_date log_time emp_id emp_name log_action 2013-06-16 08:48:48.0000000 30170 Sarah John

我有一个包含上述信息的日志表。我有一个查询来计算每个员工的每日工作时间,并将其存储在另一个数据库的十进制字段中。问题在于,会议记录已关闭,如果员工在同一天内重复一次,则会增加时间。我希望它只解释第一个好的punchin/punchout

log_date    log_time           emp_id    emp_name          log_action       
2013-06-16  08:48:48.0000000    30170   Sarah John          1
2013-06-16  16:48:48.0000000    30170   Sarah John          4
2013-06-15  07:18:48.0000000    30160   Paula Fred          1
2013-06-15  16:38:48.0000000    30160   Paula Fred          4

是否有更准确的方法来计算小时和分钟,并存储它们以供进一步计算。我需要一份报告的时间和每周总小时数。

因为您只需要每个员工日的第一个条目操作:

Select DISTINCT emp_id,log_date,SUM(datediff(Minute,stm, etm))/60.0
  as wrk_hrs from
(
    SELECT
        emp_id, log_date,
        log_time as etm,
        (
            SELECT top 1 log_time
            FROM tblLogs
            WHERE log_action = '1' and log_time <= a.log_time and emp_id=a.emp_id and a.log_date=log_date order by log_time desc
        ) as stm
    FROM tblLogs as a
    WHERE log_action = '4'
)as a
where stm is not null
group by log_date,emp_id,a.stm,a.etm;

这假设您的日志数据状态良好。如果您需要在punchin之前检查punchout或punchout之前检查多个punchin,这是一个完全不同的问题。

如果您想要更准确,请切换到秒:

SELECT
  [log_date],
  [emp_id],
  [emp_name],
  [1] AS [first_log_in],
  [4] AS [first_log_out],
  DATEDIFF(minute,[1],[4])/60.0 AS [hours]
FROM @tblLogs
PIVOT(MIN(log_time) FOR log_action IN ([1],[4])) p
SELECT StartLog.emp_id, StartLog.log_date,  SUM(datediff(Minute,stm, etm))/60.0
FROM (
    SELECT emp_id, log_date, MIN(log_time) AS stm 
    FROM tblLogs
    WHERE log_action = '1'
    GROUP BY emp_id, log_date
    ) AS StartLog
INNER JOIN 
    (
        SELECT emp_id, log_date, MIN(log_time) AS etm 
        FROM tblLogs
        WHERE log_action = '4'
        GROUP BY emp_id, log_date
    ) AS EndLog
    ON StartLog.emp_id = EndLog.emp_id AND StartLog.log_date = EndLog.log_date

注意:使用分组方式时,distinct通常是完全多余的。

更准确是什么意思?我的意思是更接近实际的小时和分钟。我注意到在一个例子中,我应该得到7小时10分钟,我得到7.1666。我知道它不多,但我必须计算每周的总小时数及其设置的总偏差。日期和时间字段的数据类型是什么?日期是日期数据类型时间是时间datatype@user2382789-10分钟等于1/6==0.166小时。如果一个人多次打孔,则只使用第一次打孔。错误是什么位置在组后面的WHERE子句中,我更正了queryI得到的模棱两可的列名“emp_id”和“log_date”。我对mssqlmy bad比较陌生。。。我为你做了一个快速而肮脏的加入。
Select emp_id,log_date,SUM(datediff(second,stm, etm))/3600.0
  as wrk_hrs from
(
    SELECT
        emp_id, log_date,
        log_time as etm,
        (
            SELECT top 1 log_time
            FROM tblLogs
            WHERE log_action = '1' and log_time <= a.log_time and emp_id=a.emp_id and a.log_date=log_date order by log_time desc
        ) as stm
    FROM tblLogs as a
    WHERE log_action = '4'
)as a
where stm is not null
group by log_date,emp_id,a.stm,a.etm;