Mencari data ulang tahun dengan PHP dan MySQL
Terkadang kita mengalami kesulitan untuk mencari siapa saja yang berulang tahun mulai dari tanggal X sampai tanggal Y jika data tersimpan di dalam database MySQL. Hal ini disebabkan karena saat disimpan di dalam database, format tanggal lahir adalah Y-m-d (2000-12-21).
Jika mencari siapa yang berulang tahun pada 01 Januari 2021 sampai 14 Januari 2021, caranya masih mudah, karena tahunnya sama. Tetapi akan jadi masalah jika pencarian lintas tahun, misalnya: 24 Desember 2020 sampai 05 Januari 2021.
Baca Juga: Penggunaan Bootstrap-DateTimePicker untuk range tanggal
Untuk memudahkan, kita berikan contoh data di kolom: tgl_lahir, yaitu
- Jaka: 1997-02-01
- Mega: 2001-01-14
- Satria: 2000-12-21
Kita asumsikan kita akan mencari data siapa yang berulang tahun antara 10 Januari 2021 sampai 02 Februari 2021. Karena tahunnya sama, maka pencarian bisa lebih mudah, yaitu dengan mencari range antara tanggal dan bulan dari kolom tgl_lahir.
Syntax di MySQL adalah
<?php
$result=doQuery("select * from [table] where (DATE_FORMAT(tgl_lahir, '%m-%d')
BETWEEN DATE_FORMAT(?, '%m-%d') AND
DATE_FORMAT(?, '%m-%d'))
order by RIGHT(tgl_lahir,5) ASC", Array('2021-01-10','2021-02-02'));
?>
doQuery adalah sql query sesuai dengan class mysql yang kita gunakan.
BETWEEN adalah function dari MySQL untuk mencari data antara X dan Y.
order by RIGHT(tgl_lahir,5) ASC artinya mengurutkan hasil dari RIGHT(tgl_lahir,5), di mana RIGHT(tgl_lahir,5) adalah function MySQL untuk mengambil 5 karakter dari ujung paling kanan. Jika valuenya: 2001-01-14, maka RIGHT(tgl_lahir,5)-nya adalah 01-14.
Output dari hasil di atas adalah:
- Mega: 2001-01-14
- Jaka: 1997-02-01
Nah, query akan berbeda jika data yang dicari lintas tahun, misalnya mencari data siapa yang ulang tahun antara tanggal 20 Desember 2020 sampai 15 Januari 2021. Cara di atas tidak bisa digunakan lagi.
Berikut caranya:
Baca Juga: Penggunaan Bootstrap-DateTimePicker untuk range tanggal
$result=doQuery("select *, if(MONTH(tgl_lahir)>MONTH('2021-01-15'), MONTH(tgl_lahir), MONTH(tgl_lahir)+12) ord,
if(DAY(tgl_lahir)>DAY('2021-01-15"'), DAY(tgl_lahir), DAY(tgl_lahir)+31) ord2
where
( (DATE_FORMAT(tgl_lahir, '%m-%d')
BETWEEN DATE_FORMAT(?, '%m-%d') AND
DATE_FORMAT(?, '%m-%d'))
OR
(DATE_FORMAT(tgl_lahir, '%m-%d')
BETWEEN DATE_FORMAT(?, '%m-%d') AND
DATE_FORMAT(?, '%m-%d')) ) order by ord,ord2",
Array('2020-12-20','2020-12-31','2021-01-01','2021-01-15'));
Di sini ada cukup banyak variable yang digunakan.
if(MONTH(tgl_lahir)>MONTH('2021-01-15'), MONTH(tgl_lahir), MONTH(tgl_lahir)+12) artinya jika bulan lahir > dari 01 (Januari), maka akan return bulan lahir normal. Jika tidak, akan di return dengan ditambahkan 12.
Hal yang sama juga berlaku untuk if(DAY(tgl_lahir)>DAY('2021-01-15"'), DAY(tgl_lahir), DAY(tgl_lahir)+31) ord2
Hal ini dilakukan untuk seolah-olah membuat tanggal akhir lebih besar dari tanggal awal, supaya kita bisa menggunakan function BETWEEN dari Mysql.
Hasil dari query di atas adalah:
- Satria: 2000-12-21
- Mega: 2001-01-14