※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら

Archive

Archive for 2010/7/7

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';

MoriMoriMoriMori MySQL