2013-01-08 25 views
8

Tôi có một thực thể có tên Đấu giá với hai trường loại datetime: date1 và date2. Tôi muốn CHỌN tất cả các hàng đấu giá trong đó sự khác biệt giữa ngày1 và ngày 2 ít hơn 30 phút. Làm cách nào tôi có thể thực hiện việc này bằng Ngôn ngữ truy vấn Doctrine?Làm thế nào để có được sự khác biệt ngày trong ngôn ngữ truy vấn Doctrine (dql)?

DATE_DIFF (date1, date2) như tài liệu nói "Tính toán sự khác biệt trong ngày giữa date1-date2". Nơi tôi cần sự khác biệt cho từng phút.

EDIT: Vì vậy, đây là việc thực hiện hoàn toàn của một chức năng tùy chỉnh 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) . 
     '))'; 
    } 
} 

Sau đó, trong app/config/config.yml bạn thêm này:

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

Trả lời

2

Bạn có thể sử dụng TIMEDIFF của MySQL (với TIME_TO_SEC và chia cho 60):

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

Tôi tin rằng bạn có thể triển khai nó trong Doctrine2 như trong this example cho DATE_DIFF.

+0

Tôi hy vọng sẽ có một số giải pháp dql tích hợp cho việc này. Nhưng có vẻ như việc xác định chức năng tùy chỉnh sẽ là cần thiết. Cảm ơn. – JohnM2

+1

Và ở đây thông tin làm thế nào để đăng ký chức năng tùy chỉnh như vậy trong Symfony2: http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html – JohnM2