SQLiteへPHPで作成したEXTRACT関数を設定する

SQLiteのSTRFTIME関数では取得できない日付要素を取得できるようにEXTRACT関数を実装してみます。

SQLiteの日付型データから日付要素を取得する方法

SQLiteにはSTRFTIME関数という日付要素を取得する関数が用意されています。
ですが、この関数はSQL標準やほかのデータベースにさえこの関数は存在しません

しかも、取得できる日付要素がほかのデータベースより格段に少なく使い勝手が悪いうえ、上に書いた通り独自仕様なので移植性も汎用性もありません。

ですので、ISOのSQL標準に記載されているEXTRACT関数を実装してみます。
ここではPostgreSQLの仕様に合わせたEXTRACT関数にしてみたいと思います。

EXTRACT関数のPHPコード

今回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 '';
    }
  }
);