Bagaimanakah cara mengisi tarikh kosong dalam hasil SQL, sama ada pada sisi MySQL atau Perl, dan apakah cara yang paling mudah?
P粉448346289
P粉448346289 2023-08-24 13:14:12
0
2
533
<p>Saya sedang membina csv pantas daripada jadual mysql menggunakan pertanyaan seperti: </p> <pre class="brush:php;toolbar:false;">pilih TARIKH(tarikh),kira(tarikh) daripada kumpulan jadual mengikut TARIKH(tarikh) susunan mengikut tarikh asc;</pre> <p>Kemudian buangnya terus ke dalam fail dalam perl: </p> <pre class="brush:php;toolbar:false;">while(my($date,$sum) = $sth->fetchrow) { cetak CSV "$tarikh,$sumn" }</pre> <p>Walau bagaimanapun, terdapat jurang tarikh dalam data: </p> <pre class="brush:php;toolbar:false;">| 2008-08-05 | |. 2008-08-07 |. <p>Saya ingin mengisi data, mengisi tarikh yang hilang dengan entri kiraan sifar, dan berakhir dengan: </p> <pre class="brush:php;toolbar:false;">| 2008-08-05 | |. 06-08-2008 | |. 2008-08-07 |. <p>Saya menyusun penyelesaian yang sangat kekok (hampir pasti buggy) menggunakan pelbagai hari dalam sebulan dan beberapa matematik, tetapi pasti ada cara yang lebih langsung, sama ada dalam mysql atau perl. </p> <p>Sebarang idea/cadangan genius tentang mengapa saya begitu bodoh? </p> <hr /> <p>Akhirnya saya memilih untuk menggunakan prosedur tersimpan untuk menjana jadual sementara untuk mengendalikan julat tarikh yang diperlukan atas beberapa sebab: </p> <ul> <li>Saya tahu julat tarikh yang perlu dicari setiap kali</li> <li>Malangnya, pelayan ini tidak boleh memasang modul perl pada masa ini, dan ia berada dalam keadaan teruk sehingga ia tidak mempunyai apa-apa seperti Date::-y dipasang</li> </ul> <p>Lelaran tarikh/masa dalam jawapan perl juga sangat baik, saya harap saya boleh memilih berbilang jawapan! </p>
P粉448346289
P粉448346289

membalas semua(2)
P粉733166744

Apabila saya perlu menangani masalah ini, untuk mengisi tarikh yang hilang, saya sebenarnya mencipta jadual rujukan yang mengandungi hanya semua tarikh yang saya minati dan menyertai jadual data pada medan tarikh. Ia kasar dan kasar, tetapi ia berkesan.

SELECT DATE(r.date),count(d.date) 
FROM dates AS r 
LEFT JOIN table AS d ON d.date = r.date 
GROUP BY DATE(r.date) 
ORDER BY r.date ASC;

Untuk output, saya akan menggunakan SELECT INTO OUTFILE dan bukannya menjana CSV secara manual. Dengan cara ini kita tidak perlu risau tentang melarikan diri daripada watak istimewa.

P粉593649715

Apabila anda memerlukan sesuatu yang serupa di bahagian pelayan, anda biasanya membuat jadual yang mengandungi semua tarikh yang mungkin antara dua titik dalam masa, dan kemudian meninggalkan sertai jadual ini dengan hasil pertanyaan. Serupa dengan:

create procedure sp1(d1 date, d2 date)
  declare d datetime;

  create temporary table foo (d date not null);

  set d = d1
  while d <= d2 do
    insert into foo (d) values (d)
    set d = date_add(d, interval 1 day)
  end while

  select foo.d, count(date)
  from foo left join table on foo.d = table.date
  group by foo.d order by foo.d asc;

  drop temporary table foo;
end procedure

Dalam kes khusus ini, adalah lebih baik untuk melakukan semakan pada bahagian pelanggan dan menambah beberapa rentetan tambahan jika tarikh semasa bukan hari selepas hari sebelumnya.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan