Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menjana Julat Tarikh Harian untuk Penginapan Berbilang Tetamu dalam Pelayan SQL?
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!