2013-01-08 115 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