2012-05-03 5 views

答えて

19

あなたが最初の最初の日としてSaturdayを設定するためにDATEFIRSTを使用する必要がありますあなたの週。値は月曜日を示し、値はは土曜日を示します。次にDATEPARTweekまたはwkまたはwwを使用して、日付列の値をグループ化することができます。 2012-01-07ので、あなたは、日付2012-01-072012-01-08のために値以下のサンプルデータで見ることができる

はweekno の下にグループ化され土曜日です。 1月1日は、常に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、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努力のため。シヴァの答えがそれほど素晴らしいわけではないので、それがうまくいくかどうかは分からない。 –

+0

これは本当に私が本当に他のdbmsから羨望の唯一のものです...クエリの他の部分で選択句からエイリアスを使用する能力。 –

1

はこれで本当の問題を抱えていたが、これは設定されて防止することができる余分なテーブルやDATEFIRSTを防ぎます。ここで私の答えは、既知の日付メソッドと呼び出しレコードを取得して検索されます。

19000101 =月曜日 - したがって、あなたのようにDATEPART機能を使用する必要があります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

として土曜日に設定覚えることは必ずしも容易で:

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

希望すると、これが役立ちます。

関連する問題