SQL Server GROUP BY datetime, saat dakikasını ve tarih ve toplam değeri olan bir seçimi yok sayar


86

İki alanlı bir masam var - datetimeve int. datetimeSaat ve dakikayı görmezden gelerek sadece tarihte bir grup yapmak istiyorum . SELECTİfadesi tek bir gün int toplamına eşleştiren bir tarih dönmelidir.


1
cevaplardan birini kabul etmek güzel olurdu ( sadece
soruyu

Yanıtlar:


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

11
Bu yalnızca SQL Server 2008+ (Tarih veri türü tanıtıldığında) çalışacaktır. 2005 veya öncesinde iseniz, dönüştürmeyi dönüştürmek (dönüştürmek (int, Datetimefield), datetime) olarak değiştirmek işe yaramalıdır.
Derek Kromm

'Tarih Türü tanımlı bir sistem türü değil' diyen bir hata alıyorum.
Steven

5
@Steven - sonra Derek'in yorumuna bakın. Bu nedenle soruya SÜRÜMÜNÜZÜ dahil etmek iyi bir fikirdir .
JNK

@Derek bu işe yaramıyor. Bir select convert(convert(int, getdate()), datetime)yanlış sözdizimi hatasıyla başarısız
rabudde

1
üzgünüm, dönüştür (datetime, convert (int, getdate ()))
Derek Kromm

24

Hangi SQL sunucusu sürümünü kullandığını belirtmediğinden ( datetür 2005'te mevcut değildir), biri de kullanabilir

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

2000/2005 gibi eski sürümlerde, bu ihtiyaç için varchar dönüşümü kullanımdan daha yavaştırDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already

7

Bunu yapmam gereken seçenekleri araştırmaya geldim, ancak kullandığım yöntemin en basit olduğuna inanıyorum:

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
Bu, SQL Server'ın herhangi bir sürümünde çalışır ve varchar dönüşümlerini kullanmaktan daha hızlıdır.
Used_By_Al Zaten

"Dd" nin ne olduğunu açıklayabilir misiniz? İçine ne koyman gerektiğini anlamıyorum.
BelovedFool

"gg", güne eşdeğer tarih bölümüdür. Ayrıca "day", "d" veya "dd" yi de kullanabilirsiniz
Jefferson Silva

3

- Veri türü ve biçim bir tarih ve saat veri türü ile tutarlı kaldığı için bunu seviyorum

;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

Şahsen ben format fonksiyonunu tercih ediyorum, tarih kısmını çok kolay bir şekilde değiştirmenize izin veriyor.

     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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.