Kira Bilangan Rekod untuk Setiap Tarikh Antara 2 Tarikh
Dalam sistem pangkalan data, selalunya perlu mengambil data berdasarkan tarikh yang ditentukan julat. SQL menyediakan fungsi dan teknik terbina dalam untuk memudahkan tugas ini. Artikel ini menangani cabaran mengira bilangan rekod bagi setiap tarikh dalam julat tarikh tertentu.
Pernyataan Masalah
Memandangkan dua tarikh, niatnya adalah untuk mencipta pertanyaan yang mengembalikan kiraan rekod untuk setiap tarikh dalam julat itu. Untuk menggambarkan, katakan kita ingin mendapatkan semula kiraan permintaan sokongan yang dibuat antara 1 November 2020 dan 22 Februari 2021, daripada jadual bernama tbl_Support_Requests.
Percubaan Gagal
Percubaan awal untuk menyelesaikan masalah ini melibatkan menggunakan Ungkapan Jadual Biasa (CTE) dipanggil Date_Range_T untuk menjana senarai berurutan tarikh dalam julat yang ditentukan. Walau bagaimanapun, definisi rekursif CTE mengakibatkan pertembungan jenis operan antara datetime2 dan int.
Penyelesaian
Untuk mengatasi isu ini, pendekatan yang lebih cekap adalah dengan menggunakan pengiraan jadual atau fungsi. Jadual penjumlahan, juga dikenali sebagai penjana nombor, menyediakan satu siri nombor berjujukan yang boleh berfungsi sebagai sumber untuk menjana julat tarikh.
Berikut ialah penyelesaian yang dioptimumkan menggunakan fungsi jadual penjumlahan Itzik Ben-Gan:
DECLARE @StartDate date = '2020-11-01', @EndDate date = '2021-02-22'; WITH L0 AS ( SELECT 1 AS c FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1), (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ), L1 AS ( SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B ), L2 AS ( SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B ), Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum FROM L2 ) Date_Range_T (d_range) AS ( SELECT TOP(DATEDIFF(day, @StartDate, @EndDate) + 1) DATEADD(day, rownum - 1, @StartDate) AS d_range, DATEADD(day, rownum, @StartDate) AS d_rangeNext FROM Nums ) SELECT d_range, COUNT(Id) AS Total FROM Date_Range_T LEFT JOIN tbl_Support_Requests R ON R.CreatedDate >= T.d_range AND R.CreatedDate < T.d_rangeNext GROUP BY d_range ORDER BY d_range ASC
Penyelesaian ini menjana julat tarikh dalam julat yang ditentukan (#StartDate# hingga #EndDate#), termasuk titik akhir tarikh. Ia kemudian menyertai jadual julat ini dengan jadual tbl_Support_Requests pada lajur CreatedDate, menapis rekod yang termasuk dalam setiap julat tarikh. Akhir sekali, ia mengumpulkan keputusan mengikut tarikh dan mengira bilangan rekod untuk setiap tarikh.
Atas ialah kandungan terperinci Bagaimana Mengira Rekod Harian Dalam Julat Tarikh Ditentukan dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!