人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLのBETWEEN演算の挙動について質問です。
比較対象のカラムの精度によって違う結果が返ってきます。

なぜ1つめの結果は0になってしまうのでしょうか??


mysql> select '2010-07-26 00:00:00' BETWEEN '2010-07-25' AND '2010-07-26';
+-------------------------------------------------------------+
| '2010-07-26 00:00:00' BETWEEN '2010-07-25' AND '2010-07-26' |
+-------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select '2010-07-26' BETWEEN '2010-07-25' AND '2010-07-26';
+----------------------------------------------------+
| '2010-07-26' BETWEEN '2010-07-25' AND '2010-07-26' |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
1 row in set (0.01 sec)

●質問者: まつぼっくり
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:00 2010-07-25 MySQL SEC SELECT
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
●70ポイント ベストアンサー

'2010-07-26 00:00:00' をDATETIME型として認識せずTEXT型として認識していることが原因です

テキストとしてソートしてみれば下記のような具合になってしまいますから範囲外ということになります

2010-07-25
2010-07-26
2010-07-26 00:00:00

自動認識による場合は今回の例のように間違った認識をしてしまう場合がありますので下記のように明示してやる必要があります

SELECT CAST('2010-07-26 00:00:00' AS DATETIME) BETWEEN '2010-07-25' AND '2010-07-26'

'2010-07-26 00:00:00'がDATETIME型なので'2010-07-25'および'2010-07-26'がDATE型もしくDATETIME型であれば、下記のように自動的に調整が行われるためキャストが必要なのは一箇所だけでよいということになります

http://dev.mysql.com/doc/refman/5.1-olh/ja/date-and-time-types.h...

MySQL 5.1.18 よりも前のバージョンでは、DATE 値が DATETIME 値と比較されるときは、DATETIME 値の時刻部分が無視されます。そうしないと、比較が文字列の比較として行われる可能性があります。MySQL 5.1.18 以降のバージョンでは、DATE 値に時刻部分を '00:00:00' として追加することにより、強制的に DATETIME 型にします。以前の動作を再現するには、CAST() 関数を使用して比較のオペランドが以前のように扱われるようにします。次に例を示します。

date_col = CAST(NOW() AS DATE)

◎質問者からの返答

納得しました!

サーバのバージョンは、5.0.67なのでTEXTとして認識されているようです。

とても丁寧な説明と的確な回答ありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ