Maison >base de données >tutoriel mysql >Comment générer efficacement une plage de dates pour plusieurs inscriptions d'invités dans SQL Server ?

Comment générer efficacement une plage de dates pour plusieurs inscriptions d'invités dans SQL Server ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-10 11:56:43611parcourir

How to Efficiently Generate a Date Range for Multiple Guest Registrations in SQL Server?

Générer efficacement une plage de dates d'inscription des invités dans SQL Server

Bien que le titre de l'article soit exact, il ne rend pas pleinement compte du scénario spécifique consistant à générer une ligne pour chaque invité chaque jour en fonction des dates d'arrivée et de départ de l'invité. Cette réponse améliorée approfondira une technique permettant d'atteindre l'efficacité à l'aide de tables de recherche spécialisées.

Utilisez une table de recherche dédiée

La solution utilisant la fonction ROW_NUMBER() offre une efficacité louable pour cette tâche particulière. La requête optimisée suivante utilise une table de recherche pour générer la plage de dates nécessaire :

<code class="language-sql">DECLARE @start DATE, @end DATE;
SELECT @start = '20110714', @end = '20110717';

;WITH n AS 
(
  SELECT TOP (DATEDIFF(DAY, @start, @end) + 1)
    n = ROW_NUMBER() OVER (ORDER BY [object_id])
  FROM sys.all_objects
)
SELECT 'Bob', DATEADD(DAY, n-1, @start)
FROM n;</code>

Élargir à plusieurs invités

Pour étendre cette technique à plusieurs invités, la requête suivante peut être adaptée :

<code class="language-sql">DECLARE @t TABLE
(
    Member NVARCHAR(32),
    RegistrationDate DATE,
    CheckoutDate DATE
);

INSERT @t SELECT N'Bob', '20110714', '20110717'
UNION ALL SELECT N'Sam', '20110712', '20110715'
UNION ALL SELECT N'Jim', '20110716', '20110719';

;WITH [range](d,s) AS 
(
  SELECT DATEDIFF(DAY, MIN(RegistrationDate), MAX(CheckoutDate))+1, MIN(RegistrationDate) 
  FROM @t 
),
n(d) AS
(
  SELECT DATEADD(DAY, n-1, (SELECT MIN(s) FROM [range]))
  FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_objects) AS s(n)
  WHERE n <= (SELECT d FROM [range])
)
SELECT t.Member, n.d
FROM @t t
INNER JOIN n ON n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;</code>

Cette requête modifiée génère efficacement la plage de dates requise pour tous les membres de la table fournie.

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