Maison > base de données > tutoriel mysql > Comment récupérer efficacement une plage de dates dans SQL Server ?

Comment récupérer efficacement une plage de dates dans SQL Server ?

Mary-Kate Olsen
Libérer: 2025-01-12 10:43:44
original
927 Les gens l'ont consulté

How to Efficiently Retrieve a Range of Dates in SQL Server?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal