2013-01-08 181 views
8

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

DATE_DIFF(DATE1,DATE2)的文件说, “计算在天 DATE1-DATE2之间的区别”。我在哪里需要与分钟的差异。

编辑:所以这里是一个自定义功能的完整实现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) . 
     '))'; 
    } 
} 
在您的应用程序/配置/ config.yml

然后补充一点:

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

回答

2

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

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

我相信你可以在Doctrine2中实现它,如DATE_DIFF的this example

+0

我希望这里会有一些内置的dql解决方案。但似乎定义自定义函数将是必要的。谢谢。 – JohnM2

+1

这里的信息如何在Symfony2中注册这样的自定义函数:http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html – JohnM2