it-swarm.it

SQL Server GROUP BY datetime ignora l'ora, i minuti e una selezione con una data e un valore di somma

Ho una tabella con due campi: datetime e int. Voglio fare un gruppo su datetime solo alla data ignorando l'ora e i minuti. L'istruzione SELECT dovrebbe restituire una data mappata alla somma dell'int di un singolo giorno.

73
Steven
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
115
JNK

Dato che non ha specificato quale versione di SQL Server utilizza (il tipo date 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)
24
rabudde

Sono venuto alla ricerca delle opzioni che avrei dovuto fare questo, tuttavia, credo che il metodo che uso sia 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;
6
Jefferson Silva

- Mi piace questo come il tipo di dati e il formato rimane coerente con un tipo di dati 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
3
SqlHog

Personalmente preferisco la funzione di formattazione, ti permette semplicemente di cambiare molto facilmente la parte della data.

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