Ho un'entità denominata Asta con due campi di tipo datetime: data1 e data2. Vorrei selezionare tutte le righe dell'asta in cui la differenza tra date1 e date2 è inferiore a 30 minuti. Come posso farlo usando Doctrine Query Language?Come ottenere la differenza di data in Doctrine Query Language (dql)?
date_diff (date1, date2) come documentazione dice "Calcola la differenza in giorni tra date1-data2". Dove ho bisogno della differenza al minuto.
EDIT: Così qui è l'implementazione completa di una funzione personalizzata 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) .
'))';
}
}
Poi, nel tuo app/config/config.yml aggiungere questo:
doctrine:
(...)
orm:
(...)
dql:
numeric_functions:
time_diff: MyProject\DQL\TimeDiff
Spero che ci sarà una soluzione dql integrata per questo. Ma sembra che la definizione della funzione personalizzata sarà necessaria. Grazie. – JohnM2
E qui informazioni su come registrare tale funzione personalizzata in Symfony2: http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html – JohnM2