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.


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)

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)

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;

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

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.