Maison >base de données >tutoriel mysql >Comment générer une plage de dates quotidienne pour les séjours de plusieurs invités dans SQL Server ?

Comment générer une plage de dates quotidienne pour les séjours de plusieurs invités dans SQL Server ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-10 09:46:40437parcourir

How to Generate a Daily Date Range for Multiple Guests' Stays in SQL Server?

Générer une plage de dates dans SQL Server

Bien que le titre implique de générer une plage de dates, le principal problème est de créer plusieurs lignes pour chaque jour où un invité a séjourné dans l'établissement. Étant donné le nom du client, la date d'arrivée et la date de départ, l'objectif est de générer une ligne pour chaque jour du séjour.

La requête suivante résout efficacement cette tâche :

<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>

L'exécution de cette requête produira les résultats suivants (basés sur l'exemple fourni) :

<code>Bob     2011-07-14
Bob     2011-07-15
Bob     2011-07-16
Bob     2011-07-17</code>

Pour les situations où plusieurs invités doivent être hébergés, la requête peut être adaptée sous une forme plus complète :

<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 MAX(d) FROM [range])
)
SELECT t.Member, n.d
FROM n CROSS JOIN @t AS t
WHERE n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;</code>

Cette requête adaptée produit les résultats suivants, qui contiennent des données sur plusieurs invités :

<code>Member    d
--------  ----------
Bob       2011-07-14
Bob       2011-07-15
Bob       2011-07-16
Bob       2011-07-17
Sam       2011-07-12
Sam       2011-07-13
Sam       2011-07-14
Sam       2011-07-15
Jim       2011-07-16
Jim       2011-07-17
Jim       2011-07-18
Jim       2011-07-19</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