Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Julat Tarikh dengan Cekap dalam Pelayan SQL?

Bagaimana untuk Mendapatkan Julat Tarikh dengan Cekap dalam Pelayan SQL?

DDD
DDDasal
2025-01-12 11:22:42411semak imbas

How to Efficiently Retrieve a Date Range in SQL Server?

Dapatkan semua tarikh antara dua tarikh tertentu dalam SQL Server

Keperluan

Matlamatnya adalah untuk mendapatkan senarai lengkap semua tarikh dalam julat tertentu dari tarikh mula hingga tarikh tamat. Maklumat ini akan disimpan dalam kursor untuk pemprosesan seterusnya.

Cabaran

Untuk menyelesaikan tugasan ini, pertanyaan menggunakan Ungkapan Jadual Biasa (CTE) rekursif dilaksanakan:

<code class="language-sql">;with GetDates As (
    select DATEADD(day,1,@maxDate) as TheDate
    UNION ALL
    select DATEADD(day,1, TheDate) from GetDates
    where TheDate < @minDate
)
SELECT TheDate FROM GetDates</code>

Walau bagaimanapun, ralat berlaku semasa cuba mengisi kursor dengan hasil CTE:

<code class="language-sql">SET @DateCurSor = CURSOR FOR
SELECT TheDate
FROM GetDates</code>

Mesej ralat menyatakan ralat sintaks berhampiran kata kunci "SET".

Penyelesaian

Kaedah lain disyorkan iaitu menggunakan kalendar. Jika jadual kalendar tidak wujud, ia boleh dibuat dengan mudah. Jadual ini menyediakan perwakilan jadual tarikh, sangat memudahkan proses mendapatkan semula.

<code class="language-sql">DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date <= @MaxDate;</code>

Jika tiada jadual kalendar, prosedur mudah yang melibatkan jadual sistem sys.all_objects disediakan:

<code class="language-sql">DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;</code>

Elakkan menggunakan kursor

Menggunakan kursor dalam SQL Server biasanya tidak disyorkan. Sebaliknya, operasi berasaskan set lebih popular kerana prestasi unggulnya. Dalam senario yang diterangkan, tugas menentukan kuantiti item tertentu pada tarikh tertentu boleh dicapai tanpa menggunakan kursor:

<code class="language-sql">SELECT TOP 1 date, it_cd, qty 
FROM T
WHERE it_cd = 'i-1'
AND Date BETWEEN @MinDate AND @MaxDate;</code>

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Julat Tarikh dengan Cekap dalam Pelayan SQL?. 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