我有一个名为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%'")
但对我来说这似乎是一个丑陋的黑客攻击。有更好的方法吗?
答案 0 :(得分:4)
考虑到您的数据库中有 DATETIME 字段,可能是使用 LIKE (这完全取决于数据库和表的引擎)您没有使用的算法优化为DATE操作。
一种解决方案是使用DQL支持的 BETWEEN 运算符指定整天(从第一秒到最后一秒),如其EBNF中所示:
$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 的用户函数,该函数可以执行您期望的操作(可以轻松地执行前面提到的示例)。