집 >데이터 베이스 >MySQL 튜토리얼 >SQL Server에서 여러 손님의 숙박에 대한 일일 날짜 범위를 생성하는 방법은 무엇입니까?
SQL Server에서 날짜 범위 생성
제목에서 다양한 날짜를 생성한다는 의미가 있지만 주요 문제는 고객이 시설에 머물렀던 날짜별로 여러 행을 생성하는 것입니다. 게스트 이름, 체크인 날짜, 체크아웃 날짜가 주어지면 숙박 날짜별로 행을 출력하는 것이 목표입니다.
다음 쿼리는 이 작업을 효과적으로 해결합니다.
<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>
이 쿼리를 실행하면 다음과 같은 결과가 생성됩니다(제공된 예에 따라).
<code>Bob 2011-07-14 Bob 2011-07-15 Bob 2011-07-16 Bob 2011-07-17</code>
여러 명의 게스트를 수용해야 하는 상황의 경우 쿼리를 보다 포괄적인 형식으로 조정할 수 있습니다.
<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>
이 조정된 쿼리는 여러 손님에 대한 데이터를 포함하는 다음 결과를 생성합니다.
<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>
위 내용은 SQL Server에서 여러 손님의 숙박에 대한 일일 날짜 범위를 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!