MySQLのdatetime型の問い合わせ時の注意 
2010/7/7 水曜日 19:46:21
こんばんは。MoriMoriMoriMoriです。
今回は、なんとなくうまく行きそうだからOKでしょ、
という感じでやると失敗するパターンについて書きます。
下記のような顧客情報テーブルがあったとします。
DESC users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | | | | birthday | date | NO | | | | | created | datetime | NO | | | | +----------+--------------+------+-----+---------+----------------+ SELECT * FROM users; +----+---------+------------+---------------------+ | id | name | birthday | created | +----+---------+------------+---------------------+ | 1 | takeshi | 1986-01-21 | 2010-02-10 11:40:30 | | 2 | isamu | 1980-01-05 | 2010-05-17 15:12:32 | | 3 | mikiko | 1983-12-12 | 2010-05-31 18:10:18 | | 4 | fumio | 1976-07-13 | 2010-06-05 09:37:49 | +----+---------+------------+---------------------+
データが登録された日付(created)で
2010/1/1~2010/5/31までのデータを抽出したい、とします。
以下のSQLを投げてみましょう。
SELECT * FROM users WHERE created >= '2010-01-01' AND created <= '2010-05-31';
クエリの結果は以下。
+----+---------+------------+---------------------+ | id | name | birthday | created | +----+---------+------------+---------------------+ | 1 | takeshi | 1986-01-21 | 2010-02-10 11:40:30 | | 2 | isamu | 1980-01-05 | 2010-05-17 15:12:32 | +----+---------+------------+---------------------+
そうです。
created <= '2010-05-31'
としてるにも関わらず、mikikoさんのデータが引っ張って来れてません。
datetime型にdate型で検索しようとすると、予想通りの結果になりません。
面倒くさがらず、以下のようなSQLにしましょう。
SELECT * FROM users WHERE created >= '2010-01-01 00:00:00' AND created <= '2010-05-31 23:59:59';
または
SELECT * FROM users WHERE created >= '2010-01-01 00:00:00' AND created < '2010-06-01 00:00:00';