¿Cómo puedo agrupar por columna de fecha y hora sin tener en cuenta el tiempo?

221

Tengo un montón de pedidos de productos e intento agrupar por fecha y sumar la cantidad para esa fecha. ¿Cómo puedo agrupar por mes / día / año sin tener en cuenta la parte de tiempo?

3/8/2010 7:42:00 debe agruparse con 3/8/2010 4:15:00

El hombre de los panecillos
fuente
2
Ver también grupo
Michael Freidgeim

Respuestas:

374

Transmitir / Convertir los valores a un Datetipo para su grupo por.

GROUP BY CAST(myDateTime AS DATE)
Oded
fuente
3
¿Sabes cómo haría lo mismo con LINQ to SQL?
The Muffin Man
1
@ Nick: no estoy seguro. Intenta usarlo DateTime.Date.
Oded
3
- Linq to Sql: DateTime.Date- Entity Framework:EntityFunctions.TruncateTime(myDateTime)
The Muffin Man
1
Estoy de acuerdo, estaba respondiendo a The Muffin Man que estaba preguntando al respecto en un contexto ORM.
Niels Brinch
44
Muchas gracias ... resolvió mi problema. agregado 'grupo por CAST (fecha_modificada como fecha)'. no olvide agregar el mismo (CAST (fecha_modificada como fecha)) en select cluase.
Mohammed mansoor
25
GROUP BY DATEADD(day, DATEDIFF(day, 0, MyDateTimeColumn), 0)

O en SQL Server 2008 en adelante, simplemente podría Date enviar como se sugirió @Oded:

GROUP BY CAST(orderDate AS DATE)
Trigo Mitch
fuente
16

En pre Sql 2008 Al sacar la parte de fecha:

GROUP BY CONVERT(CHAR(8),DateTimeColumn,10)
Kamyar
fuente
2
Para obtener una explicación sobre la función de conversión y el tipo de fecha y hora (significado de char (8) y 10), consulte w3schools.com/sql/func_convert.asp
super1ha1
7

GROUP BY DATE(date_time_column)

Aravindh Gopi
fuente
2

Aquí hay un ejemplo que usé cuando necesitaba contar la cantidad de registros para una fecha en particular sin la porción de tiempo:

select count(convert(CHAR(10), dtcreatedate, 103) ),convert(char(10), dtcreatedate, 103)
FROM dbo.tbltobecounted
GROUP BY CONVERT(CHAR(10),dtcreatedate,103)
ORDER BY CONVERT(CHAR(10),dtcreatedate,103)
usuario3169774
fuente
1
ORDER BY no funcionará como se supone porque no lo tratará como una fecha, por lo que se ordenará por día
Arma X
2

Aquí está el ejemplo funciona bien en Oracle

select to_char(columnname, 'DD/MON/yyyy'), count(*) from table_name group by to_char(createddate, 'DD/MON/yyyy');
Radhakrishnan
fuente
2

CAST datetime campo hasta la fecha

select  CAST(datetime_field as DATE), count(*) as count from table group by CAST(datetime_field as DATE);
Ruchira
fuente
0

Creo que debes agruparte por ese día del mes del año. Entonces, ¿por qué no usar las funciones TRUNK_DATE? La forma en que funciona se describe a continuación:

Group By DATE_TRUNC('day' , 'occurred_at_time')
alireza
fuente
date_trunc es para PostgreSQL, no para SQL Server, que por las etiquetas, el OP estaba buscando una solución para el servidor SQL.
Dave Hogan