2012-05-03 392 views

回答

19

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

您可以在2012-01-08正在weekno 因为2012-01-07分组的日期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

OK,未经检验的,因为我没有SQL服务器得心应手,虽然直接翻译成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 
+0

+1努力。不能告诉你它是否有效,但是因为Siva的答案并不那么棒。 –

+0

这真的是我唯一真正嫉妒其他dbms的东西......在查询的其他部分使用select子句中的别名的能力。 –

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上

2

您应该使用DATEPART功能:

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

希望这可以帮助你。

相关问题