Rumah > pangkalan data > tutorial mysql > Bagaimana Mengira Rekod Harian Dalam Julat Tarikh Ditentukan dalam SQL?

Bagaimana Mengira Rekod Harian Dalam Julat Tarikh Ditentukan dalam SQL?

Linda Hamilton
Lepaskan: 2024-12-19 11:52:13
asal
668 orang telah melayarinya

How to Count Daily Records Within a Specified Date Range in SQL?

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

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!

sumber:php.cn
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