首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在dql()中获取数据差异?

如何在dql()中获取数据差异?
EN

Stack Overflow用户
提问于 2013-01-08 13:48:49
回答 1查看 8.9K关注 0票数 10

我有一个名为Auction的实体,它有两个类型为datetime的字段: date1和date2。我想选择所有拍卖行,其中date1和date2之间的差异小于30分钟。如何使用Doctrine查询语言做到这一点?

DATE_DIFF(date1,date2)文档中写着“计算Date1-Date 2之间的days在Date1-Date 2中的差异”。我需要的是每分钟的差别。

编辑:下面是自定义函数TIME_DIFF的完整实现

代码语言:javascript
复制
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;

/**
 * Custom DQL function returning the difference between two DateTime values
 * 
 * usage TIME_DIFF(dateTime1, dateTime2)
 */
class TimeDiff extends FunctionNode
{
    /**
     * @var string
     */
    public $dateTime1;

    /**
     * @var string
     */
    public $dateTime2;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->dateTime1 = $parser->ArithmeticPrimary();       
        $parser->match(Lexer::T_COMMA);
        $this->dateTime2 = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'TIME_TO_SEC(TIMEDIFF(' .
            $this->dateTime1->dispatch($sqlWalker) . ', ' .
            $this->dateTime2->dispatch($sqlWalker) .
        '))'; 
    }
}

然后在您的app/config/config.yml中添加以下内容:

代码语言:javascript
复制
doctrine:
    (...)
    orm:
        (...)
        dql:
            numeric_functions:
                time_diff: MyProject\DQL\TimeDiff    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-08 14:45:55

您可以使用MySQL的TIMEDIFF (使用TIME_TO_SEC并除以60):

代码语言:javascript
复制
TIME_TO_SEC(TIMEDIFF(date1, date2)) / 60;

我相信您可以在Doctrine2中实现它,就像在这个例子 for DATE_DIFF中一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14216376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档