当我看到这个问题的答案时,我知道我会去'duh',但尽管如此:
如何按星期对日期字段进行分组,星期从星期六开始?
您需要首先使用DATEFIRST设置Saturday
为一周的第一天。值1表示星期一,值6表示星期六。然后,您可以将DATEPART与week
orwk
或ww
一起使用来对日期列值进行分组。
您可以在下面的示例数据中看到日期值2012-01-07
和2012-01-08
分组在第2周下,因为2012-01-07是星期六。任何一年的1 月 1 日始终是一年中的第一周。
脚本:
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,这可能会被阻止。这是我使用已知日期方法和正在检索的通话记录的答案。
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 上测试