Doctrine 2 DATE_ADD MySQL函数与计算间隔值

3

我有一个查询语句可以给我返回一个Unix时间戳,这个时间戳的计算是先选择表字段中的日期时间值,然后再加上表中的另一个值。查询语句类似于以下内容:

SELECT UNIX_TIMESTAMP(DATE_ADD(mydatetimefield, INTERVAL m.myfield1 + m.myfield2 MINUTE)) FROM mytable AS m

这个查询在phpMyAdmin中可以正确执行,但是当我尝试使用Doctrine 2的createQueryBuilder方法时,在"myfield"处出现错误。似乎它不支持INTERVAL关键字后的计算值。

Error: Expected Doctrine\ORM\Query\Lexer::T_COMMA, got 'm'

我如何使用Doctrine获取相同的查询结果?我使用QueryBuilder是因为我有一些命名参数。


1
你应该同时提供使用 createQueryBuilder 的代码。 - dan
你在示例中也简化了查询吗? - kmfk
如何使用DATE_ADD或DATE_SUB函数,以小时数为间隔。 请参考此答案:http://stackoverflow.com/a/22223127/879708 - Francis
2个回答

3
默认情况下,Doctrine不支持特定供应商的所有功能,例如DATE_ADD。但是,您可以使用自定义定义的函数。该链接具有专门用于日期添加的示例。 在Doctrine 2中扩展DQL:用户定义的函数 另一个选项取决于查询的复杂性,即只需在应用程序代码中处理此问题。如果您的mydatetimefield实际上是日期时间,则Doctrine将在返回的对象中将其转换为php DateTime
$myDateTimeField = $object->getMyDateTimeField();
$myDateTimeField->add(new DateInterval( $object->getMyField1() + $object->getMyField2() . 'M'));

最后,你也可以使用 dbal

当我尝试使用DateAdd函数时,出现了错误:“不允许通过用户定义的函数在DQL解析器中覆盖内部函数'date_add'”。为什么会这样? - Stefano
看起来他们添加了 DATE_ADD - 不过,从文档上看,Doctrine 的实现只支持添加 daymonth 的间隔 - DQL 函数 - 如果你想创建自己的函数并允许添加分钟,你需要使用不同的函数名称。 - kmfk
我觉得不能覆盖默认函数真的很糟糕,但是我通过使用原始 SQL 查询来解决了这个问题,而不是使用 DQL。 - Stefano

1

我不确定这是否是原因,但由于它在你使用m别名处抱怨缺少逗号,我怀疑它无法正确解析用户定义的函数。

你是否已经将DATE_ADDUNIX_TIMESTAMP定义为DQL用户定义函数?请参考Date Add示例获取更多详细信息。


删除 UNIX_TIMESTAMP 自定义函数并不能解决问题。 - Stefano
@Stefano 而且你已经定义了 DATE_ADD 作为自定义函数了吗? - dan
不,我没有。我试图像在MySQL中一样使用DATE_ADD函数,但是我发现Doctrine 2不支持INTERVAL,并且也不完全支持所有类型(小时,分钟等)。我将使用kmfk报告的函数。 - Stefano
@Stefano 这是你的选择,但你也可以使用 DATE_ADD,参见我在答案中提供的示例链接。 - dan
你发布的DateAdd函数代码与我通过kmfk在github上找到的代码相同。该函数和文章的作者是同一个人。 - Stefano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接