SQL Server GROUP BY datetime mengabaikan jam menit dan pilih dengan tanggal dan nilai jumlah

86

Saya memiliki meja dengan dua bidang - datetimedan int. Saya ingin melakukan grup dengan datetimesatu - satunya pada tanggal mengabaikan jam dan menit. The SELECTpernyataan harus kembali tanggal yang memetakan ke jumlah dari int dari satu hari.

Steven
sumber
1
menerima salah satu jawaban akan menyenangkan ( hanya penanya yang bisa melakukannya )
Used_By_Already

Jawaban:

138
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
JNK
sumber
11
Ini hanya akan bekerja di SQL Server 2008+ (ketika tipe data Tanggal diperkenalkan). Jika Anda berada di tahun 2005 atau lebih lama, mengubah cast untuk mengonversi (convert (int, Datetimefield), datetime) seharusnya berfungsi.
Derek Kromm
Saya mendapatkan pesan kesalahan yang mengatakan bahwa 'Jenis Tanggal bukanlah tipe sistem yang ditentukan'.
Steven
5
@ Steven - lihat komentar Derek. Inilah mengapa ide yang bagus untuk menyertakan VERSI Anda dalam pertanyaan.
JNK
@ Derek ini sepertinya tidak berhasil. A select convert(convert(int, getdate()), datetime)gagal dengan kesalahan sintaks yang salah
rabudde
1
maaf, ubah (tanggal waktu, konversi (int, getdate ()))
Derek Kromm
24

Karena dia tidak menentukan versi SQL server yang dia gunakan ( datetipe tidak tersedia pada tahun 2005), seseorang juga dapat menggunakan

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
rabudde
sumber
Dalam versi yang lebih lama seperti konversi varchar 2000/2005 untuk kebutuhan ini lebih lambat daripada penggunaanDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already
7

Saya datang untuk meneliti opsi yang harus saya lakukan ini, namun, saya yakin metode yang saya gunakan adalah yang paling sederhana:

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;
Jefferson Silva
sumber
1
Ini akan berfungsi di semua versi SQL Server dan lebih cepat daripada menggunakan konversi varchar.
Digunakan_By_Sudah
Bisakah Anda menjelaskan apa itu "dd"? Saya tidak mengerti apa yang harus Anda masukkan ke dalamnya.
BelovedFool
"dd" adalah datepart yang setara dengan hari. Anda juga dapat menggunakan "day", "d" atau "dd"
Jefferson Silva
3

- Saya suka ini karena tipe datanya dan formatnya tetap konsisten dengan tipe data waktu tanggal

;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
SqlHog
sumber
2

Secara pribadi saya lebih suka fungsi format, memungkinkan Anda untuk mengubah bagian tanggal dengan sangat mudah.

     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;
Krik
sumber