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

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

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 11:10:42785parcourir

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

Comment générer une plage de dates pour les dates d'arrivée de plusieurs invités dans SQL Server ?

Cet article présentera une méthode efficace pour générer des enregistrements quotidiens dans SQL Server pour chaque invité pendant son séjour. Légèrement différente du titre « Comment générer une plage de dates dans SQL Server », cette méthode se concentre davantage sur la génération d'enregistrements d'enregistrement quotidiens pour chaque invité. Nous utilisons des expressions de table communes (CTE) pour y parvenir.

Solution :

La requête suivante combine intelligemment les fonctions CTE et ROW_NUMBER() pour générer une séquence de dates couvrant l'intégralité du séjour du client :

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

Résultat :

宾客姓名 日期
Bob 2011-07-14
Bob 2011-07-15
Bob 2011-07-16
Bob 2011-07-17

Élargir à plusieurs invités :

Pour accueillir plusieurs convives, nous pouvons utiliser un deuxième CTE pour rejoindre la table d'hôtes avec la séquence de dates généré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 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>

Résultat :

宾客姓名 日期
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

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