Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Semua Tarikh Dalam Julat Tertentu dalam MySQL, Termasuk Tarikh Tanpa Rekod?

Bagaimana untuk Mendapatkan Semua Tarikh Dalam Julat Tertentu dalam MySQL, Termasuk Tarikh Tanpa Rekod?

Linda Hamilton
Linda Hamiltonasal
2024-12-13 18:39:10577semak imbas

How to Retrieve All Dates Within a Specified Range in MySQL, Including Dates with No Records?

MySQL: Mengambil Semua Tarikh Dalam Julat Tertentu, Walaupun 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:

  • Laraskan nilai '2011-01-02 00:00:00.000' dan NOW() untuk menentukan yang dikehendaki mula dan tamat julat tarikh.
  • Jika rekod wujud di luar julat tarikh yang dinyatakan dalam pertanyaan, ia masih akan disertakan dalam keputusan.
  • Penyelesaian ini tidak bergantung pada jadual struktur atau kehadiran rekod dalam jadual pengguna. Ia menjana jujukan tarikh yang komprehensif dalam julat yang ditentukan dan menggabungkan keputusan dengan data daripada jadual, jika ada.

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!

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