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
Lepaskan: 2025-01-10 09:46:40
asal
411 orang telah melayarinya

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:

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;
Salin selepas log masuk

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>
Salin selepas log masuk

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

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;
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan