SQL Server GROUP BY datetime ignora la hora, el minuto y selecciona con una fecha y un valor de suma

86

Tengo una tabla con dos campos datetimey int. Quiero hacer un grupo el datetimeúnico en la fecha ignorando la hora y el minuto. La SELECTdeclaración debe devolver una fecha que se corresponda con la suma del int de un solo día.

Steven
fuente
1
aceptar una de las respuestas sería bueno ( solo el autor de la pregunta puede hacer eso )
Used_By_Already

Respuestas:

135
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
JNK
fuente
11
Esto solo funcionará en SQL Server 2008+ (cuando se introdujo el tipo de datos Date). Si está en 2005 o antes, cambiar la conversión para convertir (convertir (int, Datetimefield), datetime) debería funcionar.
Derek Kromm
Recibo un error que dice que "Tipo de fecha no es un tipo de sistema definido".
Steven
5
@Steven - luego mira el comentario de Derek. Por eso es una buena idea incluir su VERSIÓN en la pregunta.
JNK
@Derek, esto no parece funcionar. A select convert(convert(int, getdate()), datetime)falla con un error de sintaxis incorrecta
rabudde
1
lo siento, convert (datetime, convert (int, getdate ()))
Derek Kromm
24

Como no especificó qué versión del servidor SQL usa (el datetipo no está disponible en 2005), también se podría usar

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
rabudde
fuente
En versiones anteriores como 2000/2005, la conversión varchar para esta necesidad es más lenta que el uso deDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already
7

Vine investigando las opciones que tendría para hacer esto, sin embargo, creo que el método que uso es el más simple:

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;
Jefferson Silva
fuente
1
Esto funcionará en cualquier versión de SQL Server y es más rápido que usar conversiones varchar.
Used_By_Already
¿Podría aclarar qué es "dd"? No entiendo lo que se supone que debes poner.
BelovedFool
"dd" es datepart equivalente a día. También puede usar "día", "d" o "dd"
Jefferson Silva
3

- Me gusta esto como tipo de datos y el formato sigue siendo consistente con un tipo de datos de fecha y hora

;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
SqlHog
fuente
2

Personalmente prefiero la función de formato, le permite simplemente cambiar la parte de la fecha muy fácilmente.

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