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

Bagaimana untuk Menjana Julat Tarikh dengan Cekap untuk Berbilang Pendaftaran Tetamu dalam SQL Server?

Susan Sarandon
Susan Sarandonasal
2025-01-10 11:56:43595semak imbas

How to Efficiently Generate a Date Range for Multiple Guest Registrations in SQL Server?

Menjana julat tarikh pendaftaran tetamu dengan cekap dalam SQL Server

Walaupun tajuk artikel adalah tepat, ia tidak menyampaikan sepenuhnya senario khusus untuk menjana baris untuk setiap tetamu pada setiap hari berdasarkan tarikh daftar masuk dan daftar keluar tetamu. Balasan yang dipertingkat ini akan menyelidiki teknik untuk mencapai kecekapan menggunakan jadual carian khusus.

Gunakan jadual carian khusus

Penyelesaian menggunakan fungsi ROW_NUMBER() memberikan kecekapan yang boleh dipuji untuk tugasan khusus ini. Pertanyaan dioptimumkan berikut menggunakan jadual carian untuk menjana julat tarikh yang diperlukan:

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

Kembangkan kepada berbilang tetamu

Untuk melanjutkan teknik ini kepada berbilang tetamu, pertanyaan berikut boleh disesuaikan:

<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 d FROM [range])
)
SELECT t.Member, n.d
FROM @t t
INNER JOIN n ON n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;</code>

Pertanyaan yang diubah suai ini berkesan menjana julat tarikh yang diperlukan untuk semua ahli dalam jadual yang disediakan.

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