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!