0

我有一个名为Szerzodes.datetime 字段的学说实体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 操作进行优化的算法。

一种解决方案是使用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 用户定义函数创建一个名为DATE的用户函数,该函数可以满足您的期望(它可以轻松完成上述示例)。

于 2012-06-01T03:17:30.687 回答