Menjana Julat Tarikh Lengkap dengan Nilai Hilang
Apabila bekerja dengan data tarikh, selalunya perlu memaparkan semua tarikh dalam julat yang ditentukan, walaupun rekod tiada untuk beberapa tarikh. Bagaimanakah anda mencapai ini dalam SQL, memastikan tarikh yang tiada menunjukkan nilai sifar dalam lajur yang berkaitan?
Pertimbangkan jadual berikut, @temp, dengan data tarikh sampel:
INSERT INTO @temp SELECT '10/2/2012', 1 INSERT INTO @temp SELECT '10/3/2012', 1 INSERT INTO @temp SELECT '10/5/2012', 1 INSERT INTO @temp SELECT '10/7/2012', 2 INSERT INTO @temp SELECT '10/9/2012', 2 INSERT INTO @temp SELECT '10/10/2012', 2 INSERT INTO @temp SELECT '10/13/2012', 2 INSERT INTO @temp SELECT '10/15/2012', 2
Untuk mendapatkan semula semua tarikh antara dua tarikh yang diberikan, anda boleh menggunakan pertanyaan berikut:
SELECT * FROM @temp WHERE CDate BETWEEN '10/01/2012' AND '10/15/2012'
Walau bagaimanapun, pertanyaan ini hanya akan mengembalikan rekod sedia ada dalam tempoh itu julat tarikh. Untuk memasukkan tarikh yang tiada dengan nilai sifar, anda perlu mencipta julat tarikh yang lengkap dan menyertainya dengan data sedia ada:
;WITH d(date) AS ( SELECT CAST('10/01/2012' AS DATETIME) UNION ALL SELECT DATE + 1 FROM d WHERE DATE < '10/15/2012' ) SELECT t.ID, d.date CDate, ISNULL(t.val, 0) AS val FROM d LEFT JOIN temp t ON t.CDate = d.date ORDER BY d.date OPTION (MAXRECURSION 0) -- Use this if your dates are >99 days apart
Pilihan nombor MAXRECURSION mengehadkan bilangan lelaran rekursif, memastikan pertanyaan selesai dengan jayanya . Fungsi ISNULL menggantikan mana-mana nilai nol dalam lajur val dengan sifar.
Menggunakan pendekatan ini, anda boleh memastikan bahawa semua tarikh dalam julat yang ditentukan dipaparkan, dengan nilai yang tiada diwakili oleh sifar.
Atas ialah kandungan terperinci Bagaimana untuk Menjana Julat Tarikh Lengkap dalam SQL, Termasuk Tarikh Hilang dengan Nilai Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!