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.
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
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)
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;
- 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
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;