SQL - Bonne clause “where” pour le mois en cours
Qui est la bonne façon de vérifier les événements du mois en cours sur SQL Server et pourquoi?
1) WHERE (DATEDIFF(month, EventTime, GETDATE())=0))
2) WHERE (YEAR(EventTime) = YEAR(GETDATE()) AND MONTH(EventTime) = MONTH(GETDATE()))
Format de Date dans la table c'est à dire EventTime: 2011-11-30 15:68:25.000
- Remarque : Les Types de Données DATETIME, etc, n'ont pas des formats tels que. C'est juste que le format utilisé pour les représenter à l'écran, comme nous, les humains n'aiment pas la lecture binaire, etc. Si, toutefois, ils sont en fait stockées dans la table des chaînes de caractères (type NVARCHAR, etc), le format est important, et ce sera frappé les performances de mal.
- ah, non, c'est un format datetime, pas de type varchar, pas de soucis 🙂
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas accès à un Serveur SQL avec un profiler, donc je ne peux pas vraiment donner une réponse détaillée que je le voudrais.
La question est essentiellement de savoir lequel permet au moins de calcul et une utilisation plus efficace des indices.
Variantes qui utilisent la manipulation de la chaîne ont la plus haute charge de calcul, et de ne pas utiliser les index à tous. Donc je vais juste ignorer ceux. Que laisser les quatre expressions...
Les trois premiers INDICE d'utilisation des SCANs, mais ce dernier utilise un INDEX de recherche. La différence est que le format de la requête permet à l'optimiseur de savoir que vous voulez une gamme spécifique de données, du fait que c'est tous les uns à côté des autres dans un même bloc de l'index, et qu'il est très facile de trouver ce bloc.
Si, lorsque l'on regarde les plans d'exécution, vous voyez une recherche dans une version et une ANALYSE à l'autre, vous êtes beaucoup plus susceptibles de bénéficier de la CHERCHER.
>=
ET<=
. Je préfère utiliser>=
ET<
. C'est parce que je puis n'avez pas de soins si les données sont en magasin pour le jour, la minute, la milliseconde, etc. Il fonctionne quel que soit l'exactitude. Mais d'autres que, oui, les gammes normalement effectuer mieux dans mon expérience.http://use-the-index-luke.com/sql/where-clause/obfuscation/dates
Donc, utiliser quelque chose comme ceci:
Exemple de code est disponible sur la même page, même si cela trimestriel de filtrage:
http://use-the-index-luke.com/sql/where-clause/obfuscation/dates?dbtype=sqlserver#sample_quarter_begin_end
Pourquoi? Pour faire de l'indexation facile.
Logiquement, ils sont tous les deux.
Cependant, je pense que le premier est plus simple (une seule condition au lieu de deux), plus facile à comprendre et plus susceptibles d'être sargable - alors je vous suggérons d'utiliser qu'un seul.
Si vous avez un index sur cette colonne, puis les deux calculs sont en contournant l'index parce que vous n'êtes pas à l'aide de ce que la colonne est indexée sur, mais seulement une partie de l'index
Vous êtes beaucoup mieux d'utiliser quelque chose comme ceci
Vous pouvez également utiliser le même concept avec un
>=
et<=
pour les datesUne astuce très simple à l'aide de to_char fonction, regardez:
À la date exemple:
vous pouvez faire ceci:
ou pour le courant du mois de la date de système:
Un détail, to_char fonction est supporté par le langage sql et non pas par une base de données spécifique.