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

时间:2012-05-03 02:40:12

标签: sql sql-server

当我看到答案时,我知道我会去'呃',但是仍然如此:

如何按星期分组日期字段,星期几从星期开始?

4 个答案:

答案 0 :(得分:22)

您需要先使用DATEFIRSTSaturday设置为一周的第一天。值 1 表示星期一,值 6 表示星期六。然后,您可以使用DATEPARTweekwkww对日期列值进行分组。

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

Click here to view the output in 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

答案 1 :(得分:4)

您应该使用DATEPART功能:

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

希望这会对你有所帮助。

答案 2 :(得分:1)

好的,未经测试,因为我没有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

答案 3 :(得分:1)

这有真正的问题,但这可以防止可能被阻止的额外表和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上测试