FAIRE UN COUNT ET GROUPER PAR DATE AVEC LA MÉTHODE FLOOR
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
26 avril 2007 à 09:08
FENETRES
Messages postés196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009
-
3 mai 2007 à 10:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
FENETRES
Messages postés196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009 3 mai 2007 à 10:10
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és196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009 2 mai 2007 à 16:49
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és196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009 2 mai 2007 à 14:02
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és196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009 2 mai 2007 à 10:17
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és259Date d'inscriptionmercredi 3 mai 2006StatutMembreDernière intervention11 janvier 20108 29 avril 2007 à 13:04
Nix
Messages postés831Date d'inscriptionsamedi 15 mai 1999StatutMembreDernière intervention18 juillet 2009 27 avril 2007 à 18:18
Niveau perf en convertissant en char je ne suis pas sur que cela soit plus efficace. Surtout que cela peut impacter l'affichage du tri selon le context régionnal, si tu tries par date du coup le résultat est incertains.
Comme je l'ai il y a d'autres façons de faire. Celle que j'ai présenté est celle que j'utilise.
FENETRES
Messages postés196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009 26 avril 2007 à 15:43
" Select Convert(Char(10), GetDate(), 103) " retourne la date sans l'heure... je ne vois pas la difficulté !
Select Convert(Char(10), MonChamp, 103) [Ma date], Count(MonChamp) [Mon compte]
From MaTable
Group by Convert(Char(10), MonChamp, 103)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 26 avril 2007 à 09:08
Ca me plait, ça...
on evite les traitements propres aux dates, qui s'avèrent certainement très lents...
3 mai 2007 à 10:10
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 !
2 mai 2007 à 16:49
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).
2 mai 2007 à 14:02
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 ".
2 mai 2007 à 10:17
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).
29 avril 2007 à 13:04
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
27 avril 2007 à 18:18
Comme je l'ai il y a d'autres façons de faire. Celle que j'ai présenté est celle que j'utilise.
26 avril 2007 à 15:43
Select Convert(Char(10), MonChamp, 103) [Ma date], Count(MonChamp) [Mon compte]
From MaTable
Group by Convert(Char(10), MonChamp, 103)
26 avril 2007 à 09:08
on evite les traitements propres aux dates, qui s'avèrent certainement très lents...