Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sql每周对每日数据进行分组_Sql_Sql Server_Tsql - Fatal编程技术网

如何使用sql每周对每日数据进行分组

如何使用sql每周对每日数据进行分组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图对员工过去4周的工作小时数进行分组,但我希望每周对其进行分组。例如: WEEK HOURS Feb 24 to March 2 55 March 3 to March 9 40 March 10 to March 16 48 March 17 to March 23 37 这是我目前所拥有的,请帮忙。谢谢 SET DATEFIRST 1 SELECT CAST(MIN( [DT]) AS V

我试图对员工过去4周的工作小时数进行分组,但我希望每周对其进行分组。例如:

WEEK                    HOURS
Feb 24 to March 2         55
March 3 to March 9        40
March 10 to March 16      48
March 17 to March 23      37
这是我目前所拥有的,请帮忙。谢谢

SET DATEFIRST 1

    SELECT CAST(MIN( [DT]) AS VARCHAR(20))+' TO '+CAST (MAX([DT]) AS VARCHAR(20)) AS DATE,
           SUM(HOURS) AS NUM_HRS
    FROM   MyTable
    GROUP BY DATEPART(WEEK,[DT])
    HAVING COUNT(DISTINCT[DT])=7
试试像这样的东西

SELECT
    DATEADD(DD, 
            CONVERT(INT, (DATEDIFF(DD, '1/1/1900', t.DT)/7)) * 7, 
           '1/1/1900') [WeekBeginDate],
    DATEADD(DD,
            (CONVERT(INT, (DATEDIFF(DD, '1/1/1900', t.DT)/7)) * 7) + 6,
           '1/1/1900') [WeekEndDate],
    SUM(HOURS) AS NUM_HRS
FROM MyTable t
GROUP BY CONVERT(INT, DATEDIFF(DD, '1/1/1900', t.DT)/7)
虽然这是蛮力骗局,但我认为在你的情况下它会奏效

EDIT:稍微修改了查询,导致错误的原因是
DATEDIFF
计算差异的顺序

这里还有一个例子


编辑2:用日期格式更新了小提琴。若要自定义日期格式,将有所帮助。

创建一个日历辅助表,包含年、月、周、日期列(您还可以向其中添加假日和其他有趣的内容,它有许多潜在用途)并在感兴趣的期间填充它

在那之后,就这么简单了:

SELECT sum(hours), cast(min(date) as varchar), cast(max(date) as varchar)
FROM Calendar c
LEFT OUTER JOIN MyTable h on h.Date = c.date
GROUP BY year, week
ORDER BY year, week

您可以尝试类似于
groupbydatediff(DD,DT,'1/1/1900')/7的方法,我需要用我的表中的某种数据替换它吗?我得到了一些像这样奇怪的约会:1785-10-10 00:00:00。000@moe我修改了查询并添加了一个提琴。谢谢,有没有办法不显示日期中的时间?我只想显示不带零的日期。WeekBeginDate具有日期时间格式,但只希望显示日期。thanks@moe您可以随时将日期格式化为您想要的任何格式。已更新格式。添加WHERE子句以在日历上进行筛选table@moe
其中DATEDIFF(week,c.date,GETDATE())介于0和3之间
SET DATEFIRST 1

    SELECT DATEPART(WEEK,DT) AS WEEK,
           SUM(HOURS) AS NUM_HRS
    FROM   MyTable
    WHERE DT >= DATEADD(WEEK, -4, GetDate()),
    GROUP BY DATEPART(WEEK,[DT])