Sql 正常工作时间和加班时间的计算

Sql 正常工作时间和加班时间的计算,sql,sql-server-2008,Sql,Sql Server 2008,您好,我需要帮助编写sql查询,以计算两周内员工的正常工作时间和加班时间。以下是我的时间表表中一名员工的数据 Username hours date JohnSmith 3.75 5/25/2015 JohnSmith 11 5/26/2015 JohnSmith 10.25 5/27/2015 JohnSmith 13 5/28/2015 JohnSmith 13 5

您好,我需要帮助编写sql查询,以计算两周内员工的正常工作时间和加班时间。以下是我的时间表表中一名员工的数据

Username      hours     date
JohnSmith     3.75       5/25/2015
JohnSmith     11         5/26/2015
JohnSmith     10.25      5/27/2015
JohnSmith     13         5/28/2015
JohnSmith     13         5/29/2015
JohnSmith     14         5/30/2015
JohnSmith     9          5/31/2015
JohnSmith     12         6/1/2015
JohnSmith     12.5       6/2/2015

如果工时>40,则将其添加到加班工时中。这听起来很简单,因为我很难做到这一点。如果我把小时数加起来,这两周的总时间超过80小时。我应该如何求和,以便当总和大于40时,应将其添加到加班中。请给出建议。

根据您的样本数据,如果您想要的结果是这样的:

Username    Week    total   Non_overtime    Overtime
JohnSmith   22      65.00   40.00           25.00
JohnSmith   23      33.50   33.50           0.00
这样的查询应该接近您想要的:

select 
    Username
    , datepart(week,date) as Week
    , sum(hours) total
    , case when sum(hours) <= 40 then sum(hours) else 40 end as Non_overtime
    , case when sum(hours)  > 40 then sum(hours) - 40 else 0 end as Overtime
from t 
group by Username, datepart(week, date)
选择
用户名
,日期部分(周,日期)为周
,总计(小时)
,当总和(小时数)40时,则总和(小时数)-40,否则0作为加班结束
从t
按用户名、日期分组(周、日期)

我使用了MS SQL Server语法,但唯一特定于方言/系统的是用于提取星期的日期函数


查询可以改进很多,但在不知道您实际想要什么结果或使用什么数据库的情况下,我将跳过这一部分。

我假设您所说的“总和大于40”是指在给定的一周内?请澄清?结果应该是什么样的?还有,你在使用什么数据库?非常感谢你的帮助。这对我来说很有意义。由于某种原因,datepart不适合我。它说标识符“week”并不是指列、表或属性您使用的数据库和版本是什么?这可能是语法上的差异。是的,一周40个小时可以修改sql server2008@user2233326MSSQL 2008使用
datepart(周,您的日期列)
应该可以工作。请注意,
week
周围不应该有任何引号,因为它是函数期望作为文本的关键字。请参见以下SQL Fiddle工作示例: