9

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    
4

1 に答える 1

3

MySQLのTIMEDIFFを使用できます(TIME_TO_SECを使用し、60で除算します):

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

このDATE_DIFFののように、Doctrine2に実装できると思います。

于 2013-01-08T14:45:55.560 に答える