No.280


【MySQL】文字列を数値にして比較する

datetime型の時刻を比較したい

 datetime型の時刻部分だけを比較する処理など、文字列になっている値の大小を比較したいときがある。

 文字列同士での比較もそれなりに機能するけど、ゼロパディングで桁数が変わっただけで動作しなくってしまう。

 そういうときにはCAST()REPLACE()関数で、数値型に直してから比較するのが定番。


処理①:文字列を数値に変換

 CAST()関数で型の変換を行うことができる。

 極端な例だけど、下記はtext型のsampleカラムとゼロパディングされた数字の文字列を数値にして比較している例になる。

... WHERE CAST(sample AS SIGNED) >= CAST('000100')

 CAST()関数はUNSIGNEDDECIMALなどにも変更することができる。便利。

12.10 キャスト関数と演算子 CAST()


処理②:余計な文字列を消してから数値に変更する

 例えばdatetime型の時刻部分を数値にしたい場合だと、時刻の区切りに使われているコロン(:)が邪魔になり、そのまま型変換することができない。(予期せぬ数値になってしまう)

 そういうケースではREPLACE()関数を使って、邪魔になる文字列を消してからCAST()関数で型変換を行えばOK。

 下記はdatetime型の時刻が午前9時以前の要素を抽出する例になる。  

... WHERE CAST(REPLACE(TIME(sample), ":", "") AS SIGNED) <= 90000