DATE_FORMATをWhere句で使用したSQLを実行したら想定と違う結果が取れた件について
※サンプルデータ
DROP TABLE IF EXISTS `accesslog`; CREATE TABLE `accesslog` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(20) DEFAULT NULL, `date` datetime DEFAULT NULL, `requesturl` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `accesslog` VALUES ('1', '111.222.33.44', '2017-12-05 06:30:59', '/'); INSERT INTO `accesslog` VALUES ('2', '22.33.44.55', '2017-12-05 10:40:55', '/sitemap.xml'); INSERT INTO `accesslog` VALUES ('3', '33.44.55.66', '2017-12-05 16:03:06', '/testpage.html');
上記のようなテーブルからデータを取得する、以下のプログラムを実行したところDATE_FORMATのHがhに変わってしまい意味合いが違うSQLが発行されてしまいました。
// 日中(9時~18時)のデータを取得 $conditions = []; $conditions[] = ["date_format(date, '%H%i') >= " => '0900']; $conditions[] = ["date_format(date, '%H%i') < " => '1800']; $data = $this->Accesslog->find()->where($conditions)->toArray();
↓デバッグキットに出力されたSQLです。
日中(9時~18時)のデータを取得するSQLを発行したつもりがフォーマットがプログラムに書いたものと異なることが原因でid=2のデータしか取得できていません。
CakePHP3のドキュメントを読んでみてもいまいち理解できずに色々探していたところ、以下のサイトで紹介されている方法で正常にSQLが発行されることを確認しました。
参考:CakePHP3を触ってみました 〜DATE_FORMAT()の使い方〜
// 日中(9時~18時)のデータを取得 $query = $this->Accesslog->find(); $query->where(["date_format(date, '%H%i') >= '0900'"]); $query->where(["date_format(date, '%H%i') < '1800'"]); $data = $query->toArray();
メモ終わり。