2010年2月1日月曜日

MySQLで日付型以外のフィールドで日付の比較を行うメモ

MySQLで日付を扱う場合ってたいていカラムの型として datetime とか date を指定することが多いと思うのですが、
そうではなくて、諸々の理由から日付型のカラム以外に日付(らしき)データを格納して、それを日付として比較する場合のメモ(ややこしや)


こんな感じのテーブルがあるとします。

CREATE TABLE `foo`
(
`id` INTEGER NOT NULL AUTO_INCREMENT,
`year` INTEGER,
`month` INTEGER,
`day` INTEGER,
`created_at` DATETIME NOT NULL,
)
# year, month, day にそれぞれ年,月,日が格納される


この中のyearmonthday の組み合わせが、たとえば "2010/02/15"より前のデータだけを取得したい場合どうするか?



これ、単純に年は年、月は月で比較するととんでもなく大変です。




とりあえず CONCAT (CONCAT_WS)DATE_FORMAT の組み合わせを使えばすっきり書けそうです。

SELECT CONCAT(year, month, day) FROM foo;
# => 201011

SELECT CONCAT_WS("/", year, month, day) FROM foo;
# => 2010/1/1

SELECT DATE_FORMAT(CONCAT_WS("/", year, month, day, "%Y/%m/%d")) FROM foo;
# => 2010/01/01


で、"2010/02/15" より前のデータを引っ張ってくる書き方。
SELECT
*
FROM
foo
WHERE
DATE_FORMAT(CONCAT_WS("/", year, month, day, "%Y/%m/%d")) <= "2010/02/15";





MySQLの日付時刻関数
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html


MySQLの文字列関数数
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

0 件のコメント: