datetimeタイプの2つのフィールド(date1とdate2)を持つAuctionという名前のエンティティがあります。date1とdate2の差が30分未満であるすべてのオークション行を選択したいと思います。Doctrineクエリ言語を使用してこれを行うにはどうすればよいですか?
ドキュメントに記載されている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) .
'))';
}
}
次に、app / config/ config.ymlに次を追加します。
doctrine:
(...)
orm:
(...)
dql:
numeric_functions:
time_diff: MyProject\DQL\TimeDiff