Quelle est la meilleure façon d'obtenir les résultats des 24 dernières heures dans T-SQL?
Je travaille sur la création d'un graphique pour mon client et qu'ils veulent pour obtenir le total de clients comptent sur 24 heures, 3 jours, 1 semaine, 1 mois, etc période. Je suis honnêtement pas le meilleur avec SQL, donc la production de ces requêtes ne sont pas mon fort.
En ce qui concerne l'obtention de la les clients de plus de 24 heures, j'ai rencontré deux "où" des déclarations qui peuvent travailler, mais je ne suis pas sûr de qui est le meilleur.
Première version:
WHERE DATEDIFF(hh,CreatedDate,GETDATE())>24
Deuxième Version:
WHERE CreatedDate >= DATEADD(HH, -24, GETDATE())
La première version génère de 21 lignes et la seconde génère 17 lignes (à partir du même ensemble de données, bien sûr) alors, évidemment, on est plus précis que les autres. Je penche pour la première, mais j'aimerais avoir votre avis... s'il vous plaît.
Grâce,
Andrew
source d'informationauteur ajtatum
Vous devez vous connecter pour publier un commentaire.
Éviter la première version. D'abord, parce qu'il désactive l'indice d'utilisation. La deuxième (fonctionnelle) de problème avec la première version est,
DATEDIFF(HOUR...)
retourne toutes les valeurs de moins de 25 heures. Essayez ceci pour plus de clarté:La première version n'est pas exacte.
Ce seront les valeurs de retour quelque part entre 23.0001 heures à 24.9999 heures parce que vous êtes le comptage des "frontières franchies", non d'une période de 24 heures. Considérer qu'à partir de
1:59:59
à2:00:00
est une seule seconde, maisDateDiff
par le nombre d'heures sera de retour 1 heure. De même,1:00:00
à2:59:59
est près de 2 heures, maisDateDiff
par heures renvoie le même 1 heure.La deuxième version est correcte.
L'ajout de 24 heures de la date actuelle donnera un temps exactement à 24,0 heures, à la milliseconde près. Ce sera donc le retour de 24 heures de données.
Aussi, la première version serait mauvais, même si c'était ce que tu voulais parce que le moteur aurait pour effectuer la date de calcul sur chaque ligne unique dans l'ensemble de la table, aucun indice de potentiel de l'inutile et de consommer un tas de inutile CPU. Au lieu de cela, faire le calcul sur le côté opposé de l'expression de la colonne nom. Pour dupliquer la logique de votre première expression sans perte de performance devrait ressembler à ceci:
Exemple:
GetDate() = '20100720 17:52'
DateDiff(hh, 0, '20100720 17:52') = 969065
DateAdd(hh, 969065 - 24, 0) = '20100719 17:00'
et pour le prouver, ce qui est la même que votre première expression:
DateDiff(hh, '20100719 17:00', '20100720 17:52') = 24
Peut-être s'agit pour chacun de vos clauses where?
Et comme flo mentionné à propos des index, assurez-vous juste que vous êtes l'indexation de votre CreatedDate colonne.