A chercher au lieu d'un balayage est possible:
SELECT *
FROM Periods
WHERE
PeriodYear BETWEEN Year(@startdate) AND Year(@enddate)
AND PeriodYear * 4 + PeriodQuarter
BETWEEN Year(@startdate) * 4 + DATEPART(Quarter, @startdate)
AND Year(@startdate) * 4 + DATEPART(Quarter, @enddate)
Explication:
Je compose un nouveau entier mis à l'échelle de deux pièces, l'année et le trimestre, en traitant chaque combinaison de l'année et quart comme un seul nombre.
Imaginez plutôt que je l'avais fait ainsi:
AND PeriodYear + (PeriodQuarter - 1)/4.0
BETWEEN Year(@startdate) + (DATEPART(Quarter, @startdate) - 1)/4.0
AND Year(@startdate) + (DATEPART(Quarter, @enddate) - 1)/4.0
appeler mon expression originale « MULT » et ce nouveau « Div », voici quelques années et quarts et ce que ces expressions évalueront à:
Year Qtr Div Mult
2009 1 2009.00 8037
2009 2 2009.25 8038
2009 3 2009.50 8039
2009 4 2009.75 8040
2010 1 2010.00 8041
2010 2 2010.25 8042
2010 3 2010.50 8043
Alors maintenant, si nous courons une clause WHERE contre ces lignes:
WHERE Div BETWEEN 2009.25 AND 2010.00
Vous peut voir comment il va retourner les lignes correctes. La version Mult fait exactement la même chose, en augmentant simplement l'année au lieu du trimestre en baisse. La raison pour laquelle je l'ai utilisé est parce que les mathématiques et la multiplication en nombres entiers sont plus rapides que les mathématiques et divisions fractionnaires.
La raison pour laquelle j'utilise deux conditions commençant juste avec l'année est de rendre la requête sargable. Nous voulons faire la recherche sur la base de l'année, ce qui n'est pas possible si nous le multiplions par 4 ou si nous faisons d'autres calculs. Nous obtenons donc l'analyse en seulement les bonnes années d'abord, puis affinez-la pour éliminer tous les quarts qui ne devraient pas être dans le résultat.
Une autre option consiste à ajouter une colonne calculée et à y placer un index. Cela ne nécessiterait aucune modification de l'insertion ou de la mise à jour de code (à condition d'utiliser correctement les listes de colonnes), mais vous permettrait de faire des calculs réguliers selon vos désirs.
Saajid Ismail, avez-vous vu mon commentaire ci-dessous que la réponse que vous avez choisi va forcer une analyse? De plus, il sera plus gourmand en CPU car il doit évaluer une expression sur CHAQUE RANGE dans le tableau entier ... – ErikE