Tôi có một bảng có hai trường - datetime
và int
. 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ị
Trả lời
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
Đ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. –
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
@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
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)
- 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
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;
Đ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. –
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 đó *) –