【问题标题】:Add totals per week to get remainder?每周添加总数以获得余数?
【发布时间】:2019-07-25 18:25:00
【问题描述】:

我有一个表,其中存储工作时间的时间表数据,并且对于每一天,有一个小时列,其中包含当天的工作小时数,因此基于 5 天工作周,在第五天,这 5 天的总数将出现在它旁边的名为“周总计”的列中,如下面的 1 周示例:

    TimeIn                TimeOut                Hours          Week Total
---------------------------------------------------------------------------
2019-02-18 07:10:00     2019-02-18 15:50:00      8.17
2019-02-19 07:20:00     2019-02-19 15:41:00      7.85
2019-02-20 06:57:00     2019-02-20 15:50:00      8.38
2019-02-21 07:12:00     2019-02-21 16:03:00      8.35
2019-02-22 07:09:00     2019-02-22 16:05:00      8.43           41.18  

在数据库中的任何表中都找不到“周总计”列值,因此我需要编写一个查询来计算每周的值,如果任何一周的总和超过 40,那么将超过 40 的余数与其他周的余数相加。

例如,在上表中,总数为 41.18,假设再过一周,总数为 42.07。由于这些周超过 40 周,超过 40 周的任何额外的总和将是 1.18 + 2.07。因此需要计算每周 5 个工作日。

到目前为止我有:

SELECT
    employeeID,
    SUM(DATEDIFF([second], [TimeIn], [TimeOut]) / 60.0  / 60.0) AS Hours
FROM 
    Time
WHERE 
    TimeIn BETWEEN DATEADD(YEAR, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) 
               AND DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), -1)
GROUP BY 
    employeeID

但这只是返回他们的EmployeeID 以及他们在我过滤的日期范围内的全部工作时间。

我如何将其缩小到每周 5 个工作日的总数,以便获得每周工作的总小时数,如果有超过 40 小时,那么将剩余的时间加起来?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这有帮助吗?

    SELECT
    employeeID,
    SUM(DATEDIFF([second], [TimeIn], [TimeOut]) / 60.0  / 60.0) AS Hours,
    CASE WHEN SUM(DATEDIFF([second], [TimeIn], [TimeOut]) / 60.0  / 60.0) > 40
         THEN SUM(DATEDIFF([second], [TimeIn], [TimeOut]) / 60.0  / 60.0) - 40
         ELSE 0 END OvertimeHours
    FROM  Time
    WHERE 
        TimeIn BETWEEN DATEADD(YEAR, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) 
               AND DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), -1)
    GROUP BY 
        employeeID, DATEPART(WEEK,[TimeIn])
    

    【讨论】:

      【解决方案2】:

      将 datepart(weekday, TimeIn) 添加到 group by 子句:

      select employeeID, sum(HoursReminder)
      from(
          SELECT
              employeeID,
              SUM(DATEDIFF([second], [TimeIn], [TimeOut]) / 60.0  / 60.0) - 40.0 AS HoursReminder
          FROM 
              Time
          WHERE 
              TimeIn BETWEEN DATEADD(YEAR, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) 
                         AND DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), -1)
          GROUP BY 
              employeeID
              , datepart(weekday, TimeIn)
          ) as fr
      group by employeeID
      

      此查询将为您提供每位员工的总提醒。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        相关资源
        最近更新 更多