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
Libérer: 2025-01-10 09:46:40
original
393 Les gens l'ont consulté

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

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

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

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

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