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 ?

DDD
DDDoriginal
2025-01-12 11:22:42358parcourir

How to Efficiently Retrieve a Date Range in SQL Server?

Récupérer toutes les dates entre deux dates spécifiques dans SQL Server

Exigences

L'objectif est d'obtenir une liste complète de toutes les dates dans une plage spécifiée, de la date de début à la date de fin. Ces informations seront stockées dans le curseur pour un traitement ultérieur.

Défi

Pour accomplir cette tâche, une requête utilisant une expression de table commune (CTE) récursive est implémentée :

<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
)
SELECT TheDate FROM GetDates</code>

Cependant, une erreur s'est produite lors de la tentative de remplissage du curseur avec les résultats CTE :

<code class="language-sql">SET @DateCurSor = CURSOR FOR
SELECT TheDate
FROM GetDates</code>

Le message d'erreur indique une erreur de syntaxe à proximité du mot-clé "SET".

Solution

Une autre méthode est recommandée, qui consiste à utiliser un calendrier. Si le tableau du calendrier n’existe pas, il peut être facilement créé. Ce tableau fournit une représentation tabulaire des dates, simplifiant considérablement le processus de récupération.

<code class="language-sql">DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date <= @MaxDate;</code>

S'il n'y a pas de table calendrier, une procédure simple impliquant la table système sys.all_objects est fournie :

<code class="language-sql">DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;</code>

Évitez d'utiliser des curseurs

L'utilisation de curseurs dans SQL Server n'est généralement pas recommandée. En revanche, les opérations basées sur des ensembles sont plus populaires en raison de leurs performances supérieures. Dans le scénario décrit, la tâche consistant à déterminer la quantité d'un article spécifique à une date spécifique peut être réalisée sans utiliser de curseurs :

<code class="language-sql">SELECT TOP 1 date, it_cd, qty 
FROM T
WHERE it_cd = 'i-1'
AND Date BETWEEN @MinDate AND @MaxDate;</code>

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!

Déclaration:
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