Как мне группировать поле даты по неделям, где недели начинаются в субботу?

Я знаю, что собираюсь пойти "duh", когда я увижу ответ на этот вопрос, но тем не менее:

Как мне группировать поле даты по неделям, где недели начинаются в субботу?

Ответ 1

Вы должны сначала использовать DATEFIRST, чтобы установить Saturday в качестве первого дня вашей недели. Значение 1 обозначает понедельник, а значение 6 обозначает день субботы. Затем вы можете использовать DATEPART с week или wk или ww для группировки значений столбца даты.

В приведенных ниже примерах вы можете увидеть, что значения для дат 2012-01-07 и 2012-01-08 сгруппированы по недельно 2, потому что 2012-01-07 - суббота. 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

Ответ 2

Вы должны использовать функцию DATEPART следующим образом:

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

Надеюсь, это вам поможет.

Ответ 3

ОК, непроверено, поскольку у меня нет 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

Ответ 4

Были реальные проблемы с этим, но это предотвращает дополнительные таблицы и DATEFIRST, которые могут быть предотвращены из SET. Вот мой ответ, используя известный метод даты и записи вызовов.

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