2011-09-14 10 views

risposta

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

Questo funzionerà solo in SQL Server 2008+ (quando è stato introdotto il tipo di dati Data). Se sei nel 2005 o prima, la modifica del cast da convertire (convert (int, Datetimefield), datetime) dovrebbe funzionare. –

+0

Viene visualizzato un errore che indica che "Tipo Data non è un tipo di sistema definito". – Steven

+5

@Steven - poi guarda il commento di Derek. Ecco perché è una buona idea includere la tua ** VERSION ** nella domanda. – JNK

20

Come egli non ha specificato quale versione di SQL Server che utilizza (date tipo non è disponibile nel 2005), si potrebbe anche usare

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

+1 - buon punto su versioning – JNK

+0

he ?. ........... – Sentinel

+0

Nelle versioni precedenti come la conversione varchar 2000/2005 per questo bisogno è più lento dell'uso di 'DATEADD (dd, DATEDIFF (dd, 0, data_field), 0)' –

1

- Mi piace questo in quanto i dati tipo e il formato rimane coerente con un tipo di dati di data e ora

;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 
4

sono venuto alla ricerca delle opzioni che avrei dovuto fare questo, però, credo che il metodo che uso è il più semplice:

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

Questo funzionerà in qualsiasi versione di SQL Server ed è più veloce rispetto all'utilizzo di conversioni varchar. –