Я знаю, что собираюсь пойти "duh", когда я увижу ответ на этот вопрос, но тем не менее:
Как мне группировать поле даты по неделям, где недели начинаются в субботу?
Я знаю, что собираюсь пойти "duh", когда я увижу ответ на этот вопрос, но тем не менее:
Как мне группировать поле даты по неделям, где недели начинаются в субботу?
Вы должны сначала использовать 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
Вы должны использовать функцию DATEPART
следующим образом:
SELECT DATEPART(wk, Date), SUM(Value)
FROM Table
GROUP BY DATEPART(wk, Date)
Надеюсь, это вам поможет.
ОК, непроверено, поскольку у меня нет 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
Были реальные проблемы с этим, но это предотвращает дополнительные таблицы и 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