2013-01-08 11 views
8

Mam podmiot o nazwie Aukcja z dwoma polami typu datetime: date1 i date2. Chciałbym WYBRAĆ wszystkie wiersze aukcji, w których różnica między datą1 a datą2 wynosi mniej niż 30 minut. Jak mogę to zrobić za pomocą Doctrine Query Language?Jak uzyskać różnicę w czasie w Doctrine Query Language (dql)?

DATE_DIFF (data1, data2) jako dokumentacja mówi "Oblicz różnicę w dniach między date1-DATE2". Gdzie potrzebuję różnicy do minuty.

EDIT: Więc tutaj jest pełna realizacja funkcji niestandardowej 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) . 
     '))'; 
    } 
} 

Następnie w app/config/config.yml dodać to:

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

Odpowiedz

2

Możesz użyć TIMEDIFF MySQL (z TIME_TO_SEC i podzielić przez 60):

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

Wierzę, że można go zaimplementować w Doctrine2 podobnie jak w this example dla DATE_DIFF.

+0

Miałem nadzieję, że pojawi się jakieś wbudowane rozwiązanie dql. Wydaje się jednak, że konieczne będzie zdefiniowanie funkcji niestandardowej. Dzięki. – JohnM2

+1

A tutaj informacje, jak zarejestrować taką niestandardową funkcję w Symfony2: http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html – JohnM2

Powiązane problemy