16

当我看到这个问题的答案时,我知道我会去'duh',但尽管如此:

如何按星期对日期字段进行分组,星期从星期六开始?

4

4 回答 4

25

您需要首先使用DATEFIRST设置Saturday为一周的第一天。值1表示星期一,值6表示星期六。然后,您可以将DATEPARTweekorwkww一起使用来对日期列值进行分组。

您可以在下面的示例数据中看到日期值2012-01-072012-01-08分组在第2周下,因为2012-01-07星期六任何一年的1 月 1 日始终是一年中的第一周。

单击此处查看 SQL Fiddle 中的输出。

脚本

CREATE TABLE weekdays
(
    datevalue    datetime NOT NULL
  , numericvalue INT      NOT NULL
);

INSERT INTO weekdays (datevalue, numericvalue) VALUES
  ('2012-01-01', 4),
  ('2012-01-02', 1),
  ('2012-01-07', 2),
  ('2012-01-08', 8),
  ('2012-01-14', 3),
  ('2012-01-15', 2),
  ('2012-01-19', 6);

SET DATEFIRST 6;

SELECT      DATEPART(wk, datevalue)     weekno
        ,   SUM(numericvalue)           totalvalue
FROM        weekdays
GROUP BY    DATEPART(wk, datevalue)

输出

weekno totalvalue
------ ----------
  1        5
  2       10
  3       11
于 2012-05-03T02:54:47.043 回答
4

您应该将该DATEPART功能用作:

SELECT      DATEPART(wk, Date), SUM(Value)
FROM        Table
GROUP BY    DATEPART(wk, Date)

希望这对您有所帮助。

于 2015-05-25T14:53:47.180 回答
2

好的,未经测试,因为我没有方便的 SQL Server,但直接转换为 MySQL 似乎可以按预期工作:

SELECT * 
  FROM (SELECT your_date_field, 
               DATEADD(D, 
               -(DATEPART(DW,your_date_field) MOD 7), your_date_field) AS saturday 
          FROM your_table) 
 GROUP BY saturday
 ORDER BY your_date_field
于 2012-05-03T02:53:14.270 回答
2

对此有真正的问题,但这会阻止额外的表和 DATEFIRST,这可能会被阻止。这是我使用已知日期方法和正在检索的通话记录的答案。

19000101 = 星期一 - 总是容易记住,因此将星期六设置为 19000106

SELECT MIN(dateadd(day, datediff(
day,'19000106', CallRecords.CallStartTime)/7*7, '19000106')) 
AS CallStartTime
FROM CallRecords 
GROUP BY DATEDIFF(day,'19000106', CallRecords.CallStartTime)/7 

在 SQL Server 和 SQL Server Compact 4.0 上测试

于 2014-03-16T12:21:46.760 回答