Como agrupar por coluna de data e hora sem levar em consideração o tempo

221

Tenho vários pedidos de produtos e estou tentando agrupar por data e somar a quantidade dessa data. Como posso agrupar por mês / dia / ano sem levar em consideração a parte do tempo?

3/8/2010 7:42:00 deve ser agrupado com 3/8/2010 4:15:00

The Muffin Man
fonte
2
Ve também semelhantes grupo por hora
Michael Freidgeim

Respostas:

374

Transmitir / converter os valores em um Datetipo para o seu grupo por.

GROUP BY CAST(myDateTime AS DATE)
Oded
fonte
3
você sabe como eu faria o mesmo com o LINQ to SQL?
O Muffin Man
1
@ Nick - não tenho certeza. Tente usar DateTime.Date.
Oded
3
- Linq para Sql: DateTime.Date- Entity Framework:EntityFunctions.TruncateTime(myDateTime)
O homem de muffin
1
Concordo, estava respondendo ao Muffin Man, que estava perguntando sobre isso em um contexto de ORM.
Niels Brinch 02/02
4
Muito obrigado ... resolveu o meu problema. adicionado 'agrupar por CAST (date_modified AS DATE)'. não esqueça de adicionar o mesmo (CAST (date_modified AS DATE)) em select cluase.
Mohammed mansoor 12/04
25
GROUP BY DATEADD(day, DATEDIFF(day, 0, MyDateTimeColumn), 0)

Ou no SQL Server 2008 em diante, você pode simplesmente transmitir Date como @Oded sugerido:

GROUP BY CAST(orderDate AS DATE)
Mitch Wheat
fonte
16

No pré Sql 2008, removendo a parte da data:

GROUP BY CONVERT(CHAR(8),DateTimeColumn,10)
Kamyar
fonte
2
Para uma explicação sobre o tipo função de conversão e data tempo (ou seja, de char (8) e 10), ver w3schools.com/sql/func_convert.asp
super1ha1
7

GROUP BY DATE(date_time_column)

Aravindh Gopi
fonte
2

Aqui está um exemplo que eu usei quando precisei contar o número de registros para uma data específica sem a parte da hora:

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)
user3169774
fonte
1
O POR ORDEM não trabalho vai como deveria, porque não vai tratá-lo como data para que ele irá ordenar por dia
Arma X
2

Aqui está o exemplo funciona bem no oracle

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

Campo de data e hora do CAST até a data

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

Eu acredito que você precisa se agrupar, naquele dia do mês do ano. então porque não usar as funções TRUNK_DATE. A maneira como funciona é descrita abaixo:

Group By DATE_TRUNC('day' , 'occurred_at_time')
alireza
fonte
date_trunc é para o PostgreSQL, não para o SQL Server, que, seguindo as tags, o OP estava procurando uma solução para o SQL Server.
Dave Hogan