web-dev-qa-db-fra.com

SQL Server GROUP BY datetime ignore heure minute et sélection avec date et somme

J'ai une table avec deux champs - datetime et int. Je veux faire un groupe sur le datetime uniquement sur la date en ignorant l'heure et la minute. L'instruction SELECT doit renvoyer une date correspondant à la somme de l'int d'un jour.

73
Steven
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
115
JNK

Comme il n'a pas spécifié la version du serveur SQL qu'il utilise (le type date n'est pas disponible en 2005), on pourrait également utiliser

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
24
rabudde

Je suis venu à la recherche des options possibles, mais j’estime que la méthode que j’utilise est la plus 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;
6
Jefferson Silva

- J'aime cela car le type de données et le format restent cohérents avec un type de données date/heure

;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
3
SqlHog

Personnellement, je préfère la fonction de formatage, vous permet de changer simplement la partie de la date très facilement.

     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;
2
Krik