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

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

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

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!

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