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.