DBIx::Class
で生成された複雑なSQLクエリ(WHERE句にはSQL::Abstract
を使用)を使用していました。DBIx :: Class/SQL :: Abstract WHERE節のカラムにSQL関数を適用する
私は、エントリをフィルタするためにオペレータBETWEEN使用しています:
# SELECT title FROM tracks WHERE begin BETWEEN '2016-07-01' AND '2016-07-02'
$searchArgs->{'begin'} = { BETWEEN => ['2016-07-01', '2016-07-02' ] };
は、この実際に2016年7月2日から始まり、日付をスキップします。おそらく、これらの開始値は2016-07-02の真夜中(00:00)を過ぎており、したがってBETWEEN範囲にはないからです(最後のデータ例を参照)。 SQL-側に
が、これは簡単に修正されています
SELECT title FROM tracks WHERE DATE(begin) BETWEEN '2016-07-01' AND '2016-07-02'
# Note the DATE()-cast of begin
はSQL::Abstract
構文でこれを達成する方法はありますか?私はスカラー・リファレンス($searchArgs->{\"DATE(begin)"}
)として列名を試して、手を加えずに通過させましたが、うまくいきませんでした。
ちょうど$searchArgs->{'DATE(begin)'}
を使用すると、「DATE(開始)」という列が存在しないため、SQLエラーがトリガーされます。
# Minimal example data
CREATE TABLE test (title VARCHAR(255), begin timestamp);
INSERT INTO test (title, begin) VALUES ('Track 1', '2016-07-01T12:00:00'::timestamp), ('Track 2', '2016-07-02 12:00:00'::timestamp);
SELECT title FROM test WHERE begin BETWEEN '2016-07-01' AND '2016-07-02';
SELECT title FROM test WHERE DATE(begin) BETWEEN '2016-07-01' AND '2016-07-02';
「*動作していません」という意味ですか? – Borodin
DATE() - Functionを列側で取得する方法が見つかりませんでした。 – ghandi
確かに、あなたが試したとき何が起こったのですか? – Borodin