0

Szerzodesと呼ばれる日時フィールドで呼び出される教義エンティティがありexportalvaます。exportalvaフィールドの日付部分が特定の値であるレコードを取得する方法はありますか? たとえば、時間に関係なく、特定の日にエクスポートされたレコードを取得したいとします。私はしようとした

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE DATE(sz.exportalva) = '2012-05-17'")

しかし、DATE() は DQL の既知の関数ではないため、失敗しました。今、私は一時的に使用しています

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE sz.exportalva LIKE '2012-05-17%'")

しかし、それは私にとって醜いハックのようです。これを行うより良い方法はありますか?

4

1 に答える 1

4

データベースにDATETIMEフィールドがあることを考えると、LIKEを使用している可能性があります (これはデータベースとテーブルのエンジンに完全に依存します) DATE 操作に最適化されたアルゴリズムを使用していない可能性があります。

1 つの解決策は、 EBNF で見られるように、DQLでサポートされているBETWEEN演算子を使用して、1 日全体 (最初の 1 秒から最後の 1 秒まで) を指定することです。

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE sz.exportalva BETWEEN '2012-05-17 00:00:00' AND '2012-05-17 23:59:59'")

本当にそのために関数を使用したい場合は、条件で使用される列ではなく、常に値で関数を使用することもお勧めします。一部のデータベース (MySQL など) は、ネイティブ関数によって変更された列でインデックスを使用しません。DQL User defined functionを使用して、期待どおりのことを行うDATEというユーザー関数を作成できます(前述の例を簡単に実行できます) 。

于 2012-06-01T03:17:30.687 に答える