2012-05-03 26 views

Trả lời

19

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-072012-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 
1

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 
+0

+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. –

+0

Đó 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. –

1

Đã 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

2

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.

Các vấn đề liên quan