Tôi biết tôi sẽ đi 'duh' khi tôi thấy câu trả lời cho điều này, nhưng dù sao:Làm cách nào để nhóm một trường ngày theo tuần, nơi các tuần bắt đầu vào thứ Bảy?
Làm cách nào để nhóm một trường ngày theo tuần, nơi các tuần bắt đầu vào thứ Bảy?
Tôi biết tôi sẽ đi 'duh' khi tôi thấy câu trả lời cho điều này, nhưng dù sao:Làm cách nào để nhóm một trường ngày theo tuần, nơi các tuần bắt đầu vào thứ Bảy?
Làm cách nào để nhóm một trường ngày theo tuần, nơi các tuần bắt đầu vào thứ Bảy?
Bạn cần phải sử dụng đầu tiên để thiết lập DATEFIRSTSaturday
như ngày đầu tiên của tuần của bạn. Giá trị biểu thị Thứ hai và giá trị biểu thị ngày thứ Bảy. Sau đó, bạn có thể sử dụng DATEPART với week
hoặc wk
hoặc ww
để nhóm các giá trị cột ngày của bạn.
Bạn có thể thấy trong các dữ liệu mẫu dưới đây mà đánh giá cao cho những ngày 2012-01-07
và 2012-01-08
được nhóm dưới weekno vì 2012/01/07 là một thứ bảy. January 1 của bất kỳ năm nào luôn là tuần đầu tiên của năm.
Click here to view the output in SQL Fiddle.
Script:
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)
Output:
weekno totalvalue
------ ----------
1 5
2 10
3 11
OK, chưa hề xảy ra tôi không có SQL Server tiện dụng, mặc dù một dịch thẳng vào MySQL dường như làm việc như mong đợi:
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
Đã vấn đề thực sự với điều này nhưng điều này ngăn cản bảng phụ và DATEFIRST mà có thể bị ngăn được SET . Đây là câu trả lời của tôi bằng cách sử dụng phương thức ngày đã biết và các bản ghi cuộc gọi được truy lục.
19000101 = Thứ hai - luôn luôn dễ nhớ do đó thiết lập thứ Bảy như 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
Thử nghiệm trên SQL Server và SQL Server Compact 4.0
Bạn nên sử dụng DATEPART
chức năng như:
SELECT DATEPART(wk, Date), SUM(Value)
FROM Table
GROUP BY DATEPART(wk, Date)
Hy vọng điều này sẽ giúp bạn.
+1 cho nỗ lực. Không thể nói cho bạn biết nó có hiệu quả hay không vì câu trả lời của Siva không quá tuyệt vời. –
Đó thực sự là điều duy nhất tôi thực sự ghen tị với các dbms khác ... khả năng sử dụng bí danh từ mệnh đề select trong các phần khác của truy vấn. –