16

私はこれに対する答えを見たときに「当たり前」に行くつもりだと知っていますが、それでも:

週が土曜日から始まる場合、日付フィールドを週ごとにグループ化するにはどうすればよいですか?

4

4 に答える 4

25

最初にDATEFIRSTSaturdayを使用して、週の最初の曜日として設定する必要があります。値1は月曜日を表し、値6は土曜日を表します。次に、DATEPARTweekorwkと一緒に使用してww、日付列の値をグループ化できます。

以下のサンプル データでは、 2012-01-07Saturdayであるため、日付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
于 2012-05-03T02:54:47.043 に答える
4

DATEPART関数は次のように使用する必要があります。

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

これがお役に立てば幸いです。

于 2015-05-25T14:53:47.180 に答える
2

これには実際の問題がありましたが、これにより余分なテーブルと 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 でテスト済み

于 2014-03-16T12:21:46.760 に答える
2

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
于 2012-05-03T02:53:14.270 に答える