Techniques de récupération de plages de dates SQL Server
Défi : Récupérer efficacement une séquence de dates dans une plage spécifiée et remplir un curseur.
Méthode initiale et problème :
Une approche courante utilise une expression de table commune (CTE) récursive pour générer la série de dates :
<code class="language-sql">;with GetDates As ( select DATEADD(day,1,@maxDate) as TheDate UNION ALL select DATEADD(day,1, TheDate) from GetDates where TheDate < @minDate )</code>
Cependant, remplir directement un curseur depuis ce CTE entraîne souvent des erreurs de compilation.
Solutions :
Approche 1 : Utiliser un tableau de calendrier
La pré-création d'un tableau de calendrier offre une solution hautement optimisée. Cette table stocke une plage de dates prédéfinie, améliorant considérablement les performances des requêtes.
<code class="language-sql">CREATE TABLE Calendar ( Date DATE PRIMARY KEY ); -- Insert dates into the Calendar table (example, adjust as needed) INSERT INTO Calendar (Date) SELECT DATEADD(DAY, n, '20000101') FROM (SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 n FROM master..spt_values) AS Numbers;</code>
Récupérer les dates devient alors une simple requête :
<code class="language-sql">SELECT Date FROM Calendar WHERE Date >= @MinDate AND Date <= @MaxDate;</code>
Approche 2 : CTE récursif raffiné
Si un tableau de calendrier n'est pas réalisable, un CTE récursif raffiné peut être utilisé :
<code class="language-sql">DECLARE @MinDate DATE = '20140101'; DECLARE @MaxDate DATE = '20241231'; --Example, replace with your actual date ;WITH DateSeries AS ( SELECT @MinDate AS Date UNION ALL SELECT DATEADD(day, 1, Date) FROM DateSeries WHERE Date < @MaxDate ) SELECT Date FROM DateSeries;</code>
Recommandations de curseur :
Il est crucial de noter que les curseurs sont généralement moins efficaces que les opérations basées sur des ensembles. Pour des performances optimales, évitez les curseurs autant que possible. Les approches CTE ci-dessus, en particulier celles utilisant un tableau de calendrier, offrent des performances bien supérieures pour récupérer des plages de dates. Pensez à utiliser ORDER BY
dans le CTE pour des résultats prévisibles si nécessaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!