SQLiteのSTRFTIME関数では取得できない日付要素を取得できるようにEXTRACT関数を実装してみます。
SQLiteにはSTRFTIME関数という日付要素を取得する関数が用意されています。
ですが、この関数はSQL標準やほかのデータベースにさえこの関数は存在しません!
しかも、取得できる日付要素がほかのデータベースより格段に少なく使い勝手が悪いうえ、上に書いた通り独自仕様なので移植性も汎用性もありません。
ですので、ISOのSQL標準に記載されているEXTRACT関数を実装してみます。
ここではPostgreSQLの仕様に合わせたEXTRACT関数にしてみたいと思います。
今回EXTRACT関数を以下のように実装しました。
※以下で使用しているConnectクラスは【SQLite操作用PHPクラス】に記載しています。
$con = new Connect( '/database/file/path' ); // スカラー関数登録メソッドで登録する。 $con->regist_scalar( 'EXTRACT', function ( $date_elem, $datetime ) { try { date_default_timezone_set( 'Asia/Tokyo' ); $epoch = date_create( $datetime, new DateTimeZone( 'Asia/Tokyo' ) ); $date_elems = array( 'MILLENNIUM' => '', 'CENTURY' => strftime( '%C', $epoch->format( 'U' ) ), 'DECADE' => '', 'YEAR' => $epoch->format( 'Y' ), 'QUARTER' => '', 'MONTH' => $epoch->format( 'm' ), 'DOW' => $epoch->format( 'w' ), 'ISODOW' => $epoch->format( 'N' ), 'WEEK' => strftime( '%U', $epoch->format( 'U' ) ), 'DAY' => $epoch->format( 'd' ), 'DOY' => $epoch->format( 'z' ), 'HOUR' => $epoch->format( 'H' ), 'MINUTE' => $epoch->format( 'i' ), 'SECOND' => $epoch->format( 's' ), 'MILLISECONDS' => '', 'MICROSECONDS' => $epoch->format( 'u' ), 'EPOCH' => $epoch->format( 'U' ) ); return $date_elems[ strtoupper( $date_elem ) ]; } catch( Exception $e ) { return ''; } } );