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
Libérer: 2025-01-10 11:56:43
original
553 Les gens l'ont consulté

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

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

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!

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