あるWEBのカレンダー機能で、年と月を指定してその月に登録されたスケジュールの情報を取得するという仕組みを構築しているときのこと。
プログラム言語はPHPで、ゲットで数値を渡し、その値をSQL文に組みこむという感じ。
テスト環境で作ったシステムが完成し、テスト動作も確認し取得できていたのでこれでOKと思ってた。
$year = $_GET['year'];
$month = $_GET['month'];
$sql = "SELECT * FROM テーブル名 WHERE DATE(カラム名) BETWEEN '".$year."-".$month."-01' AND '".$year."-".$month."-31' ORDER BY カラム名 ASC";
テストではちゃんと前月取得でき、いざ本番にアップしたところ、いくつかの月の情報が取得できなかったことがわかった。
2月、4月、6月、9月、11月。
そう、31日で終わらない月のDBが取得できなかった。
DBにはちゃっと情報は入っている、けど取得できなかった。MySQLのバージョンや環境でこうも違うのか。
恐らく取得する範囲の日を31で指定しているのがダメなんだろうなと思う。
PHPでSQL文を作っているので、なんだったら$monthが31日で終わらない月の場合、最終日はその月に合わせて変更する形にしたほうがいいのかな?と思いつつ、2月は28日だしうるう年あると29日だしとこれは結構面倒なことになりそう。
調べてみると、LAST_DAY()という関数がMySQLにあるのだそう。早速以下のようにしてみた。
"SELECT * FROM テーブル名 WHERE DATE(カラム名) BETWEEN '".$year."-".$month."-01' AND LAST_DAY('".$year."-".$month."-01') ORDER BY rc_date ASC";
すると、取得できました!
LAST_DAY()の引数に日付を入れると、その日の月の最後の日を取得できるのだとか。これはちょっと便利かも。
betweenで範囲を指定するのに最終日の設定はうるう年や偶数月では変わるので、この方法はちょっと楽になった。