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
Lepaskan: 2025-01-10 11:56:43
asal
635 orang telah melayarinya

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:

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

Kembangkan kepada berbilang tetamu

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

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

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 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan