SQL Server GROUP BY datetime bỏ qua giờ phút và một lựa chọn có giá trị ngày và tổng


86

Tôi có một bảng với hai trường - datetimeint. Tôi muốn làm một nhóm vào ngày datetimeduy nhất bỏ qua giờ và phút. Câu SELECTlệnh phải trả về một ngày ánh xạ đến tổng giá trị int của một ngày.


1
Chấp nhận một trong những câu trả lời sẽ là điều tốt ( chỉ người hỏi mới có thể làm điều đó )
Đã sử dụng_By_Already 28/101717

Câu trả lời:


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

11
Đ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 ở năm 2005 trở về trước, việc thay đổi diễn viên để chuyển đổi (convert (int, Datetimefield), datetime) sẽ hoạt động.
Derek Kromm

Tôi gặp lỗi khi nói rằng 'Loại Ngày không phải là loại hệ thống được xác định'.
Steven

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

@Derek điều này dường như không hoạt động. Một select convert(convert(int, getdate()), datetime)thất bại với lỗi cú pháp sai
rabudde

1
xin lỗi, convert (datetime, convert (int, getdate ()))
Derek Kromm

24

Vì anh ta không chỉ định phiên bản máy chủ SQL nào anh ta sử dụng ( dateloại không có sẵn vào 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)

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

7

Tô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ẽ hoạt động trong bất kỳ phiên bản nào của SQL Server và nhanh hơn so với việc sử dụng chuyển đổi varchar.
Đã sử dụng_By_Already

Bạn có thể làm rõ "dd" là gì? Tôi không hiểu bạn phải đặt cái gì vào đó.
BelovedFool

"dd" là datepart tương đương với ngày. Bạn cũng có thể sử dụng "day", "d" hoặc "dd"
Jefferson Silva

3

- Tôi thích điều này vì kiểu dữ liệu và định dạng vẫn nhất quán với kiểu dữ liệu ngày giờ

;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

2

Cá nhân tôi thích chức năng định dạng hơn, cho phép bạn chỉ cần thay đổi phần ngày rất dễ dàng.

     declare @format varchar(100) = 'yyyy/MM/dd'
     select 
        format(the_date,@format), 
        sum(myfield) 
     from mytable 
     group by format(the_date,@format) 
     order by format(the_date,@format) desc;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.