Maison >base de données >tutoriel mysql >Comment récupérer efficacement une plage de dates dans SQL Server ?
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.
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".
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>
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!