MySQLでの関数を利用したソート

WordPressでの静的生成を行う際に、データベースから記事を取得するのだが、このサイトの仕様上日付昇順・時間降順で取り出したかった。だが、WordPressの仕様上、投稿時間は「2005-03-05 12:34:56」のような形で記録されているので、このままでは使えない。

真っ先に思いつくのは真ん中で区切って、それぞれでソートかければいいじゃん。ってとこなんだが、ソート方法指定部分であるORDER以降は関数が使えない。

SELECT ... ORDER BY DATE( post_date ) DESC, TIME( post_date ) ASC

これだとエラーが出てしまう。んがー! どうすりゃいいんじゃー! と3日ぐらい本気で悩んでいたら、ある日ふと思い浮かんだ。SELECTで指定したやつってそのまま使えるんでね?

SELECT DATE( post_date ) AS p_date, TIME( post_date ) AS p_time ... ORDER BY p_date DESC, p_time ASC

AS …ってのは、関数の結果を変数として宣言するみたいなもんだと思いねぇ。「2005-03-05 12:34:56」というデータをDATE関数。つまり日付部分だけ抽出してp_dateという変数を宣言して代入。しかるのちにソートに利用すると・・・できた! ローカルでは。

どうやらDATEとTIME関数はMySQLのバージョンが古いと使えないらしく、練習用のレンタルサーバー上では動かなかった。それならSUBSTRで取り出すしかないな。

SUBSTRING( post_date, 0, 10 )

これで日付部分が・・・! と思ったらなぜか空白。何も取得できない。

SUBSTRING( post_date, 11 )

こっちはOKで、時間部分を取得できた。文字列の頭から10バイト取得だよなぁ、なんで取得できないんだ? と思いながら適当に弄っていたら抽出に成功。

SUBSTRING( post_date, 1, 10 )

どうやら文字列の頭を取得するには1から始めなければいけないようだ。phpの感覚で使ってたのがいけなかったのか。最後に念のためキャストして終了。

これで無事に日付昇順・時間降順で記事を取り出すことができた。おかげで静的生成スクリプトも完成したが、まだまだMySQLを使いこなせていないなぁと実感した。ってか、初歩の初歩でつまづいてるな。