【问题标题】:Grouping Hours by Week in using SQL使用 SQL 按周分组时间
【发布时间】:2015-10-29 17:56:20
【问题描述】:

我正在尝试汇总总工作时间并按周分组。我的一周从周一开始,到周日结束。我遇到的问题是数字总是第一周的,但其余几周都很好。第一周的问题总是很低。

查看快照

这是我的代码

SELECT
    UID, 
    CONVERT(VARCHAR, x.WeekBeginDate, 101) as WeekBeginDate, 
    x.TOTAL_HOURS 
FROM
    (SELECT 
         UID,  
         DATEADD(DD, CONVERT(INT, (DATEDIFF(DD, '1/1/1900', t.DT)/7)) * 7, '1/1/1900') [WeekBeginDate],
         SUM(HOURS) AS TOTAL_HOURS 
     FROM 
         myTable t 
     WHERE 
         UID = 'test1' 
         AND DT >= DATEADD(WEEK, -6, GetDate()) 
     GROUP BY 
         UID, CONVERT(INT, DATEDIFF(DD, '1/1/1900', t.DT)/7) ) x 
ORDER BY  
    1

【问题讨论】:

  • 您可以使用 DATEPART(wk) 而不是将天除以 7。
  • 那不是因为你的开始时间是DATEADD(WEEK, -6, GetDate()),不是星期一,而是6周前的任何时间,包括小时和分钟跨度>
  • 创建一个日历表并通过连接计算,而不是那个超级语句。你会惊讶于事情是如何被简化的。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

试试这个来简化你的查询并让你的窗口正确(小提琴:http://sqlfiddle.com/#!3/35c8e/1):

set datefirst 1; --set first day of week to monday
select 
    DATEADD(DAY,(DATEPART(WEEKDAY, dt) - 1) * -1,dt) as WeekBeginDate,
    SUM(hours) AS TotalHours
from hours
where
    uid = 'test1'
    and dt >= CAST(DATEADD(WEEK,-6,DATEADD(DAY,(DATEPART(WEEKDAY, GETDATE()) - 1) * -1,GETDATE())) AS date)
group by DATEADD(DAY,(DATEPART(WEEKDAY, dt) - 1) * -1,dt)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多