首页 文章

如何在Doctrine查询语言(dql)中获取日期差异?

提问于
浏览
8

我有一个名为 Auction 的实体,其中包含两个datetime类型的字段:date1和date2 . 我想选择所有拍卖行,其中date1和date2之间的差异小于30分钟 . 如何使用Doctrine查询语言执行此操作?

DATE_DIFF(date1,date2)作为文档说“计算date1-date2之间的差异 in days ” . 我需要差异的地方 .

EDIT :所以这里是自定义函数 TIME_DIFF 的完整实现:

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 中添加:

doctrine:
    (...)
    orm:
        (...)
        dql:
            numeric_functions:
                time_diff: MyProject\DQL\TimeDiff

1 回答

  • 2

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

    TIME_TO_SEC(TIMEDIFF(date1, date2)) / 60;
    

    我相信你可以在Doctrine2中实现它,就像this example中的DATE_DIFF一样 .

相关问题