2012-05-03 382 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) 

希望這可以幫助你。

相關問題