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.


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)

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)

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;

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

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.