Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Semua Tarikh Dalam Julat Tertentu dalam MySQL, Termasuk Tarikh Tanpa Rekod?
Apabila bekerja dengan pangkalan data, selalunya perlu untuk mendapatkan semula data untuk tempoh atau julat tertentu. Walau bagaimanapun, jika tiada rekod untuk tarikh tertentu dalam julat itu, tarikh tersebut mungkin dilangkau dalam keputusan. Ini boleh menyebabkan jurang dalam analisis data dan visualisasi.
Masalah:
Dalam MySQL, pertanyaan di bawah memilih tarikh dan kiraan yang sepadan daripada jadual pengguna dalam sesuatu yang diberikan julat tarikh:
SELECT DATE(datecreated), count(*) AS number FROM users WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW()) GROUP BY DATE(datecreated) ORDER BY datecreated ASC
Pertanyaan ini mengembalikan hasil seperti itu sebagai:
date1 5 date2 8 date5 9
Walau bagaimanapun, ia melangkau tarikh dengan sifar pengguna, meninggalkan jurang dalam data. Output yang dikehendaki ialah:
date1 5 date2 8 date3 0 date4 0 date5 9
Penyelesaian:
Untuk mendapatkan semula semua tarikh dalam julat yang ditentukan, walaupun tiada rekod yang berkaitan, kita boleh menggunakan pertanyaan canggih yang memanfaatkan jujukan tarikh yang dijana. Pertanyaan di bawah mencapai ini:
select * from ( select date_add('2003-01-01 00:00:00.000', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date from (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n1, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n2, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n3, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n4, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n5 ) a where date >'2011-01-02 00:00:00.000' and date < NOW() order by date
Pertanyaan ini menggunakan subquery UNION ALL bersarang untuk menjana jujukan tarikh antara 1 Januari 2003, hingga sebelum tarikh semasa. Fungsi date_add() kemudiannya digunakan untuk menambah tarikh yang dijana secara berperingkat ke tarikh mula untuk mencipta julat tarikh yang diingini.
Nota Tambahan:
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Semua Tarikh Dalam Julat Tertentu dalam MySQL, Termasuk Tarikh Tanpa Rekod?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!