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)

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2010/07/26 17:37:13
  • 終了:2010/07/26 18:30:18

ベストアンサー

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492010/07/26 18:26:28

ポイント70pt

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

id:matsubobo

納得しました!

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

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

2010/07/26 18:29:52
  • id:windofjuly
    うぃんど 2010/07/26 18:42:16
    >5.0.67なのでTEXTとして認識
    URLの下の白枠内は今回と逆パターンの時なので無視してください
    いろいろうだうだと説明書いてて長文、蛇足になりすぎたので削ったのですが消すの忘れました
    今回の例では5.1.18以降のバージョンでもtext型と誤認識してますので適材適所でCASTは必要です。惑わせてごめんなさい
  • id:matsubobo
    確かに。

    補足にあるところは、アップキャストに関することでしたね。

    いずれにせよ、参考資料も助かります。型周りは注意しないといけないことがわかりました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません