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.