SQL Server GROUP BY datetime ignora hora minuto e uma seleção com uma data e valor de soma

86

Eu tenho uma tabela com dois campos - datetimee int. Quero fazer um grupo de no datetimeúnico na data ignorando a hora e o minuto. A SELECTinstrução deve retornar uma data que mapeia para a soma do int de um único dia.

Steven
fonte
1
aceitar uma das respostas seria bom ( apenas o autor da pergunta pode fazer isso )
Used_By_ Já

Respostas:

135
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
JNK
fonte
11
Isso só funcionará no SQL Server 2008+ (quando o tipo de dados Date foi introduzido). Se você estiver em 2005 ou antes, alterar o elenco para converter (convert (int, Datetimefield), datetime) deve funcionar.
Derek Kromm
Estou recebendo um erro dizendo que 'Tipo de data não é um tipo de sistema definido'.
Steven
5
@Steven - veja o comentário de Derek. É por isso que é uma boa ideia incluir sua VERSÃO na pergunta.
JNK
@Derek isso não parece funcionar. A select convert(convert(int, getdate()), datetime)falha com erro de sintaxe incorreta
rabudde
1
desculpe, convert (datetime, convert (int, getdate ()))
Derek Kromm
24

Como ele não especificou qual versão do servidor SQL ele usa ( datetipo não disponível em 2005), também pode ser

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
rabudde
fonte
Em versões mais antigas, como 2000/2005, a conversão varchar para essa necessidade é mais lenta do que o uso deDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already
7

Vim pesquisar as opções que teria para fazer isso, porém, acredito que o método que utilizo é o mais simples:

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
fonte
1
Isso funcionará em qualquer versão do SQL Server e é mais rápido do que usar conversões varchar.
Usado_By_Já
Você poderia esclarecer o que é "dd"? Eu não entendo o que você deve colocar nele.
BelovedFool
"dd" é parte da data equivalente a dia. Você também pode usar "day", "d" ou "dd"
Jefferson Silva
3

- Eu gosto disso porque o tipo de dados e o formato permanecem consistentes com um tipo de dados data e 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
fonte
2

Pessoalmente, prefiro a função de formato, permite que você simplesmente altere a parte da data com muita facilidade.

     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
fonte