Model::find() の fields で次のように書けば OK だった。
'fields' => array('EXTRACT(EPOCH FROM "created") AS created_epoch)
created は TIMESTAMP 型のカラム名。psql では、カラム名をダブルクォートで括らなくても動くんだけど、CakePHP の動作がダブルクォートの有無で変わってくる。
例えば、上述のようにダブルクォートで括った場合は、次のような SQL が発行される。
'fields' => array('EXTRACT(EPOCH FROM "created") AS created_epoch)
SELECT EXTRACT(EPOCH FROM "created") AS created_epoch FROM "public"."examples" AS "Example" WHERE 1 = 1
これは期待通りの動作をしてくれる。
ところが、次のようにダブルクォートで括るのを忘れた場合には、正しい SQL にはならない。
'fields' => array('EXTRACT(EPOCH FROM created) AS created_epoch)
SELECT EXTRACT("EPOCH FROM created") AS created_epoch FROM "public"."examples" AS "Example" WHERE 1 = 1
これを実行してもエラーになってしまう。
どうも、CakePHP の PostgreSQL ドライバは「 ( ) の中にクォートがない場合はカッコ内をまるごとクォートする」という動作をしているような気がする(あんまり詳しく追ってない)。