私はこれに対する答えを見たときに「当たり前」に行くつもりだと知っていますが、それでも:
週が土曜日から始まる場合、日付フィールドを週ごとにグループ化するにはどうすればよいですか?
私はこれに対する答えを見たときに「当たり前」に行くつもりだと知っていますが、それでも:
週が土曜日から始まる場合、日付フィールドを週ごとにグループ化するにはどうすればよいですか?
最初にDATEFIRSTSaturday
を使用して、週の最初の曜日として設定する必要があります。値1は月曜日を表し、値6は土曜日を表します。次に、DATEPARTをweek
orwk
と一緒に使用してww
、日付列の値をグループ化できます。
以下のサンプル データでは、 2012-01-07がSaturdayであるため、日付2012-01-07
の値2012-01-08
が weekno 2にグループ化されていることがわかります。どの年の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
DATEPART
関数は次のように使用する必要があります。
SELECT DATEPART(wk, Date), SUM(Value)
FROM Table
GROUP BY DATEPART(wk, Date)
これがお役に立てば幸いです。
これには実際の問題がありましたが、これにより余分なテーブルと 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 でテスト済み
OK、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