MySQL覚書 日付型 BETWEEN 整数型 AND 整数型が行けちゃう件

WHERE update_date BETWEEN 20200101 AND 20200131
とか書いて、ちゃんとupdate_dateが2020/1/1~1/31のデータを取ってきちゃってる。

どういうこったぁ!!!と調べたら、

“BOKU”のITな日常 『日付リテラルで日付の比較はしないほうがよさそうだ/MariaDB(MySQL)(備忘)』
という記事の中に

A DATE literal can also be an integer, in one of the following formats: YYYYMMDD or YYMMDD.
DATEリテラルは、YYYYMMDDまたはYYMMDDのいずれかの形式の整数でもかまいません。

という文章が。
MySQL
MySQL Docs『9.1.3 Date and Time Literals』
Maria
MariaDB Docs 『Date and Time Literals』
に同文がある。

ぬおぉぉぉ!スッゴ!
でも、なんか気色悪い・・・

んで、この引用記事の日付リテラルでの比較の話でうまく動かない理由は、

select case when '2018-09-01' > '2018-08-31' then 0 else 1 end;

というSQL文だと、単純に左辺側の’2018-09-01’が文字型扱いになっていることだけで、

select case when CONVERT('2018-09-01',DATE) > '2018-08-31' then 0 else 1 end;

としてやれば、解決する。
比較の対象が文字型として認識されているから、日付リテラル云々の話ではなくなっていて、
左辺が日付型と判断されれば、日付リテラルが利用できると推測する。

理解が不十分だとこういうことになるので注意が必要だが、ちゃんと基本に則り型定義通りに比較すればいいだけの話なのだよ。

Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください