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

Bagaimana untuk Menjana Julat Tarikh untuk Penginapan Berbilang Tetamu dalam SQL Server?

Linda Hamilton
Lepaskan: 2025-01-10 11:10:42
asal
784 orang telah melayarinya

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

Bagaimana untuk menjana julat tarikh untuk tarikh daftar masuk berbilang tetamu dalam SQL Server?

Artikel ini akan memperkenalkan kaedah yang cekap untuk menjana rekod harian dalam SQL Server untuk setiap tetamu semasa penginapan mereka. Berbeza sedikit daripada tajuk "Cara menjana julat tarikh dalam SQL Server", kaedah ini lebih memfokuskan pada menjana rekod daftar masuk harian untuk setiap tetamu. Kami menggunakan Ungkapan Jadual Biasa (CTE) untuk mencapai ini.

Penyelesaian:

Pertanyaan berikut dengan bijak menggabungkan fungsi CTE dan ROW_NUMBER() untuk menjana urutan tarikh yang meliputi keseluruhan penginapan tetamu:

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

Keputusan:

宾客姓名日期
Bob2011-07-14
Bob2011-07-15
Bob2011-07-16
Bob2011-07-17

Kembangkan kepada berbilang tetamu:

Untuk menampung berbilang tetamu, kami boleh menggunakan CTE kedua untuk menyertai jadual tetamu dengan urutan tarikh yang dijana:

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

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

Atas ialah kandungan terperinci Bagaimana untuk Menjana Julat Tarikh untuk Penginapan Berbilang Tetamu dalam SQL Server?. 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