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!