2012-05-30 77 views
0

我有一个称为Szerzodes的学说实体,其日期时间字段为exportalva。是否有可能以某种方式获得exportalva字段的日期部分是给定值的记录?例如,我想要获取某一天导出的记录,无论时间如何。我试图Doctrine 2 - 按日期时间字段的日期部分筛选结果

$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

考虑到你在你的数据库有一个DATETIME领域,它可能是在使用LIKE(这完全取决于数据库和表的引擎),你都没有使用进行了优化,DATE操作的算法。

一种解决方案是使用BETWEEN操作由DQL在它看到支持对指定整天(从第一个到它的最后一秒)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的用户函数,该函数执行您期望的操作(它可以很容易地完成前面提到的上述示例)。

+0

在MySQL,PostgreSQL和SQLite3中有一个DATE()函数,我没有MSSQL,也没有甲骨文来测试它,想知道为什么它没有在DQL中实现。这之间的东西似乎对我来说比以前的老东西更好,也许比我以前的DATE()想法更好。 – GergelyPolonkai

+1

对我而言,判断可能太天真了,但在时区问题上存在很多问题。 SQL没有以标准的方式处理这个问题,忽略它将是一个巨大的问题... –

+0

虽然在一个国际项目中,我会感谢你警告我,在这种情况下,这不会是一个问题。 – GergelyPolonkai