Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menjana Julat Tarikh Harian untuk Penginapan Berbilang Tetamu dalam Pelayan SQL?

Bagaimana untuk Menjana Julat Tarikh Harian untuk Penginapan Berbilang Tetamu dalam Pelayan SQL?

Patricia Arquette
Patricia Arquetteasal
2025-01-10 09:46:40393semak imbas

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

Jana julat tarikh dalam SQL Server

Walaupun tajuknya membayangkan menjana julat tarikh, masalah utama ialah mencipta berbilang baris untuk setiap hari tetamu menginap di kemudahan itu. Memandangkan nama tetamu, tarikh daftar masuk dan tarikh daftar keluar, matlamatnya adalah untuk mengeluarkan satu baris untuk setiap hari penginapan.

Pertanyaan berikut menyelesaikan tugas ini dengan berkesan:

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

Melaksanakan pertanyaan ini akan menghasilkan keputusan berikut (berdasarkan contoh yang diberikan):

<code>Bob     2011-07-14
Bob     2011-07-15
Bob     2011-07-16
Bob     2011-07-17</code>

Untuk situasi di mana berbilang tetamu perlu ditampung, pertanyaan boleh disesuaikan ke dalam bentuk yang lebih komprehensif:

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

Pertanyaan yang disesuaikan ini menghasilkan hasil berikut, yang mengandungi data untuk berbilang tetamu:

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

Atas ialah kandungan terperinci Bagaimana untuk Menjana Julat Tarikh Harian untuk Penginapan Berbilang Tetamu dalam Pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn