begin process at 2008 05 16 09:45:09
1 173 261 membres
101 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FAIRE UN COUNT ET GROUPER PAR DATE AVEC LA MÉTHODE FLOOR


Information sur la source

Catégorie :Trucs & Astuces Classé sous : count, date, floor, datetime, groupby Niveau : Débutant Date de création : 25/04/2007 Vu : 3 587

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


Description

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

  • SELECT
  • DATEADD(d,0,FLOOR(CONVERT(float,ChampDate))) As LaDate,
  • COUNT(ChampACompter) As Compte
  • FROM
  • MaTable
  • GROUP BY
  • FLOOR(CONVERT(float,ChampDate))
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.
  • signaler à un administrateur
    Commentaire de Renfield le 26/04/2007 09:08:12 administrateur CS

    Ca me plait, ça...
    on evite les traitements propres aux dates, qui s'avèrent certainement très lents...

  • signaler à un administrateur
    Commentaire de FENETRES le 26/04/2007 15:43:00


    " 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)

  • signaler à un administrateur
    Commentaire de Nix le 27/04/2007 18:18:28 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de skweeky le 29/04/2007 13:04:49 administrateur CS

    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

  • signaler à un administrateur
    Commentaire de FENETRES le 02/05/2007 10:17:09

    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).

  • signaler à un administrateur
    Commentaire de FENETRES le 02/05/2007 14:02:43

    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 ".

  • signaler à un administrateur
    Commentaire de FENETRES le 02/05/2007 16:49:39

    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).

  • signaler à un administrateur
    Commentaire de FENETRES le 03/05/2007 10:10:59

    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 !

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS