Faire un count et grouper par date avec la méthode floor

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 636 fois - Téléchargée 19 fois


Contenu du snippet

Il m'est souvent arrivé de devoir faire un Count en groupant par date avec un champ datetime comprennant la date et l'heure. Je n'ai pas trouvé de fonctionnalité par défaut qui permette de convertir en date (sans l'heure) dans SQL, mais la méthode FLOOR on peut facilement le faire.
Le but de la requête ci-dessous est de regrouper ces dates pour faire un count.

Source / Exemple :


SELECT 
	DATEADD(d,0,FLOOR(CONVERT(float,ChampDate))) As LaDate,
	COUNT(ChampACompter) As Compte 
FROM 
	MaTable
GROUP BY 
	FLOOR(CONVERT(float,ChampDate))

Conclusion :


Il y a peut-être d'autres façons de faire, mais celle-ci est simple et efficace.

A voir également

Ajouter un commentaire

Commentaires

FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Correction pour la forme...

si @dte1 = cast('02/05/2007 16:44:00' as datetime)
et @dte2 = cast('02/05/2007 00:00:00' as datetime)
alors
floor(cast(@dte1 as float)) = cast(@dte2 as float).

mais je suppose que tout le monde a compris le fond !
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Explication de l'idée exposée par Nix :

La partie décimale de la conversion en nombre réel d'une variable DateTime correspond à l'heure ainsi,
si @dte = cast('02/05/2007 16:44:00' as datetime)
alors
floor(cast(@dte as float)) = cast('02/05/2007 00:00:00' as float).
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Sur une table de 100 000 lignes j'ai mesuré un temps d'exécution de 290 ms au lieu de 540 ms.
La méthode est donc effectivement performante mais il ne faudrait pas oublier les règles de base. Dans ce cas, par exemple, il n'y a aucun intérêt à appliquer celle-ci : " le jeu n'en vaut pas la chandelle ".
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

L'optimisation passe par la création d'un index et la planification de sa défragmentation !
Quant à la remarque liée au contexte régional, il est toujours possible d'utiliser le format canonique.
Enfin, la lisibilité du code est un dernier argument pour une bonne maintenance.
Bref, je ne vois toujours qu'une complication inutile (cf. plan d'exécution).
cs_skweeky
Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
3
C'est effectivement la méthode la plus lente en passant par un char...
Pour les comparaisons : http://blogs.codes-sources.com/christian/archive/2007/04/29/sql-server-conserver-la-date-ou-l-heure-d-un-datetime-comparaison-des-methodes.aspx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.