2011-09-14 28 views
53

Tôi có một bảng có hai trường - datetimeint. Tôi muốn thực hiện một nhóm theo số datetime chỉ vào ngày bỏ qua giờ và phút. Tuyên bố SELECT phải trả về ngày lập bản đồ thành tổng của int trong một ngày.SQL Server GROUP BY datetime bỏ qua giờ phút và chọn với ngày và tổng giá trị

+0

chấp nhận một trong các câu trả lời sẽ tốt đẹp (* chỉ người hỏi có thể làm điều đó *) –

Trả lời

90
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField 
FROM MyTable 
GROUP BY CAST(Datetimefield AS DATE) 
+9

Điều này sẽ chỉ hoạt động trong SQL Server 2008+ (khi kiểu dữ liệu ngày được giới thiệu). Nếu bạn đang ở trong năm 2005 hoặc trước đó, việc thay đổi dàn diễn viên để chuyển đổi (chuyển đổi (int, datetimefield), datetime) sẽ hoạt động. –

+0

Tôi nhận được thông báo lỗi 'Loại ngày không phải là loại hệ thống được xác định'. – Steven

+5

@Steven - sau đó xem nhận xét của Derek. Đây là lý do tại sao bạn nên đưa ** VERSION ** vào câu hỏi. – JNK

20

Khi anh không nói rõ phiên bản nào của SQL server ông sử dụng (date loại không có sẵn trong năm 2005), người ta cũng có thể sử dụng

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed 
FROM table_name 
GROUP BY CONVERT(VARCHAR(10),date_column,112) 
+0

+1 - điểm tốt về versioning – JNK

+0

he ?. ........... – Sentinel

+0

Trong phiên bản cũ hơn 2000/2005 varchar chuyển đổi cho nhu cầu này là chậm hơn so với sử dụng 'DATEADD (dd, DATEDIFF (dd, 0, date_field), 0)' –

1

- Tôi thích video này như là dữ liệu gõ và định dạng vẫn còn phù hợp với một kiểu dữ liệu thời gian ngày

;with cte as(
    select 
     cast(utcdate as date) UtcDay, DATEPART(hour, utcdate) UtcHour, count(*) as Counts 
    from dbo.mytable cd 
    where utcdate between '2014-01-14' and '2014-01-15' 
    group by 
     cast(utcdate as date), DATEPART(hour, utcdate) 
) 
select dateadd(hour, utchour, cast(utcday as datetime)) as UTCDateHour, Counts 
from cte 
4

tôi đi nghiên cứu các tùy chọn mà tôi sẽ phải làm điều này, tuy nhiên, tôi tin rằng phương pháp tôi sử dụng là đơn giản nhất:

SELECT COUNT(*), 
     DATEADD(dd, DATEDIFF(dd, 0, date_field),0) as dtgroup 
FROM TABLE 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, date_field),0) 
ORDER BY dtgroup ASC; 
+1

Điều này sẽ làm việc trong bất kỳ phiên bản nào của SQL Server và nhanh hơn sử dụng chuyển đổi varchar. –

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