原则2 - 按日期时间字段的日期部分过滤结果

时间:2012-05-30 21:15:24

标签: datetime doctrine-orm

我有一个名为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%'")

但对我来说这似乎是一个丑陋的黑客攻击。有更好的方法吗?

1 个答案:

答案 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 的用户函数,该函数可以执行您期望的操作(可以轻松地执行前面提到的示例)。