【问题标题】:How to determine weekly sum of worked hours in T-SQL?如何确定 T-SQL 中每周的工作时间总和?
【发布时间】:2020-10-01 11:35:01
【问题描述】:

我有一个包含以下数据的表格:日期、工作时间。如示例所示,如何获得整周的工作时间总和?我有多年前的数据。

Date    Hours worked    Weekly hours
1/9/2020    8              32
2/9/2020    8              32             
3/9/2020    8              32
4/9/2020    8              32
5/9/2020    0              0
6/9/2020    0              0
7/9/2020    8              40
8/9/2020    8              40
9/9/2020    8              40
10/9/2020   8              40
11/9/2020   8              40
12/9/2020   0              0
1/9/2021    0              0
2/9/2021    8              32
3/9/2021    8              32
4/9/2021    8              32
5/9/2021    8              32

【问题讨论】:

    标签: sql database tsql


    【解决方案1】:

    您可以使用窗口函数。但这很棘手,因为几周可以跨越数年。一种方法是从当前日期中减去工作日数:

    select t.*,
           sum(hours_worked) over (partition by dateadd(day, - datepart(weekday, date), date)) as week_hours
    from t;
    

    注意:这使用系统配置的一周的第一天来定义周。这似乎是一种合理的方法。

    【讨论】:

      【解决方案2】:

      您的输出周数似乎是 ISO 格式的。因此 DATEPART 函数可以与 'isowk' 参数一起使用,如下查询。 如果将 DATEPART(isowk, "Date") 的 hours_worked 和 "Year" 相加,输出将与您想象的一样。

      select 
          date,
          hours_worked,
          -----------
          Year(date) as "Year",
          Datepart(isowk,date) as weekOfYear,
          -----------
          /*if you don't want to see the SUM for hours_worked=0 then you can use CASE WHEN ...*/
          case 
              when hours_worked = 0 then 0 
              else 
              sum(hours_worked) over (partition by datepart(isowk,date),year(date)) 
          end as weekly_hours,
          ----------
          /*if you want to see for all days even if hours_worked=0 then this part will be useful */
          sum(hours_worked) over (partition by datepart(isowk,date),year(date)) as weekly_hours_total
          ----------
      from test1 t
      order by 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 2021-01-01
        相关资源
        最近更新 更多