Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menjana Julat Tarikh dengan Cekap untuk Berbilang Tetamu dalam Pelayan SQL?
Penjanaan julat tarikh SQL Server
Soalan:
Walaupun gesaan melibatkan penjanaan julat tarikh, ia nampaknya lebih tertumpu pada mencipta jadual yang setiap baris mewakili setiap hari penginapan tetamu. Khususnya, berdasarkan nama tetamu, tarikh daftar masuk dan tarikh daftar keluar, matlamatnya adalah untuk menjana jadual dalam format berikut:
('Bob', 14/7), ('Bob', 15/7), ('Bob', 16/7), ('Bob', 17/7)
Penyelesaian yang cekap:
Pertanyaan berikut dianggap sebagai kaedah yang cekap untuk tujuan khusus ini dan mungkin berprestasi lebih baik daripada menggunakan jadual carian khusus:
<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>
Keputusan:
客人 | 日期 |
---|---|
Bob | 2011-07-14 |
Bob | 2011-07-15 |
Bob | 2011-07-16 |
Bob | 2011-07-17 |
Sambungan koleksi:
Teknik ini boleh diperluaskan kepada set data menggunakan pertanyaan berikut:
<code class="language-sql">DECLARE @t TABLE ( 会员 NVARCHAR(32), 入住日期 DATE, 退房日期 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(入住日期), MAX(退房日期))+1, MIN(入住日期) FROM @t -- WHERE ? ), 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.会员, n.d FROM n CROSS JOIN @t AS t WHERE n.d BETWEEN t.入住日期 AND t.退房日期;</code>
Keputusan:
会员 | 日期 |
---|---|
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 |
Diringkaskan:
Seperti yang @Dems nyatakan, pertanyaan ini boleh dipermudahkan lagi:
<code class="language-sql">;WITH natural AS ( SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) - 1 AS val FROM sys.all_objects ) SELECT t.会员, d = DATEADD(DAY, natural.val, t.入住日期) FROM @t AS t INNER JOIN natural ON natural.val <= DATEDIFF(DAY, t.入住日期, t.退房日期);</code>
Atas ialah kandungan terperinci Bagaimana untuk Menjana Julat Tarikh dengan Cekap untuk Berbilang Tetamu dalam Pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!