Symfony を使っていて Doctrine で Oracle データベースの日付を扱う時に
Could not convert database value "10-11-10" to Doctrine Type date
というようなエラーがでました。
Oralce が返してくる日付フォーマットと Doctrine のフォーマットが合わないので、このようなエラーが出ます。
sqlplus
コマンドで、日付を含むテーブルをクエリしてみると、フォーマットがそのようになっています。NLS_DATE_FORMAT
を指定すると、そのフォーマットで返ってくるようになります。
では、Symfony ではどうしたらよいのでしょう。
こちらの答えがありました。
service.yaml に次の定義を追加します。
oracle.listener:
class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
tags:
- { name: doctrine.event_listener, event: postConnect }
このサービスは、Doctrine に初めから用意されているものです。
そのヘッダ部のコメントにこう書いてあります
/**
* Should be used when Oracle Server default environment does not match the Doctrine requirements.
*
* The following environment variables are required for the Doctrine default date format:
*
* NLS_TIME_FORMAT="HH24:MI:SS"
* NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
* NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS"
* NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM"
*/
翻訳すると
Oracle Server のデフォルト環境が Doctrine の要件と一致しない場合に使われます。
Doctrine のデフォルトの日付書式には以下の環境変数が必要です。
ということで、この設定をすると Oracle の日付フィールドを適切に扱えるようになります。