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

SQLiteで2つの日付の期間を計算する関数を実装します。

SQLiteの日付型データと期間計算について

SQLiteにはそもそも日付型(DATE/TIME/TIMESTAMP)のデータ型が存在しないため、直接2つの日付の期間を計算できません

また、PostgreSQL/MySQL/OracleにはINTERVAL型という期間専用のデータ型あったりしますが、それもSQLiteにはありません。

よって、期間を計算できる関数をPHPで実装してみます。 今回はMySQLの仕様に合わせてTIMESTAMPDIFF関数を実装しようと思います。

PHPで実装するTIMESTAMPDIFF関数の仕様

MySQLのTIMESTAMPDIFF関数は以下のような使い方をします。

-- MySQLでのTIMESTAMPDIFF関数仕様
SELECT TIMESTAMPDIFF(日付要素, '引く日付', '引かれる日付');

-- 例
SELECT TIMESTAMPDIFF(DAY, '2017-01-01', '2017-02-01');
-- 結果:31
            

MySQL仕様のように日付要素を指定するのも面倒ですし、引数の並びも「'引かれる日付', '引く日付'」としたほうが直感的だと思います。
返値もただの数値では扱いづらいので、以下のような仕様で実装しようとおもいます。

-- 今回実装するTIMESTAMPDIFF関数の仕様
SELECT TIMESTAMPDIFF('引かれる日付', '引く日付');

-- 例
SELECT TIMESTAMPDIFF('2017-02-01', '2017-01-01');
-- 結果:0000-01-00 00:00:00

SELECT TIMESTAMPDIFF('2017-02-02', '2017-01-01');
-- 結果:0000-01-01 00:00:00

            

TIMESTAMPDIFF関数のPHPコード

今回TIMESTAMPDIFF関数を以下のように実装しました。
※以下で使用しているConnectクラスは【SQLite操作用PHPクラス】に記載しています。

$con = new Connect( '/database/file/path' );
// スカラー関数登録メソッドで登録する。
$con->regist_scalar(
  'TIMESTAMPDIFF',
  function ( $start_timestamp, $end_timestamp ) {
    try {
      $start    = date_create( $start_timestamp );
      $end      = date_create( $end_timestamp );
      $interval = date_diff( $start, $end );
      $formatted = 
        sprintf( 
          "%04d-%02d-%02d %02d:%02d:%02d",
          $interval->format( '%y' ),
          $interval->format( '%m' ),
          $interval->format( '%d' ),
          $interval->format( '%h' ),
          $interval->format( '%i' ),
          $interval->format( '%s' )
        );
      return $formatted;
    } catch( Exception $e ) {
      return '';
    }
  }
);