1
0
mirror of synced 2025-02-09 00:39:25 +03:00

Add support second, minute, week, year on DATE_ADD and DATE_SUB

This commit is contained in:
Sébastien Lévêque 2017-10-02 12:03:26 +02:00 committed by Luís Cobucci
parent ed86ee2567
commit f277eef6ea
No known key found for this signature in database
GPG Key ID: EC61C5F01750ED3C
3 changed files with 73 additions and 5 deletions

View File

@ -51,7 +51,11 @@ class DateAddFunction extends FunctionNode
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker) $this->intervalExpression->dispatch($sqlWalker)
); );
case 'minute':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddMinutesExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'hour': case 'hour':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddHourExpression( return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddHourExpression(
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
@ -62,16 +66,25 @@ class DateAddFunction extends FunctionNode
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker) $this->intervalExpression->dispatch($sqlWalker)
); );
case 'week':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddWeeksExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'month': case 'month':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddMonthExpression( return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddMonthExpression(
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker) $this->intervalExpression->dispatch($sqlWalker)
); );
case 'year':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddYearsExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
default: default:
throw QueryException::semanticalError( throw QueryException::semanticalError(
'DATE_ADD() only supports units of type second, hour, day and month.' 'DATE_ADD() only supports units of type second, minute, hour, day, week, month and year.'
); );
} }
} }

View File

@ -40,6 +40,16 @@ class DateSubFunction extends DateAddFunction
public function getSql(SqlWalker $sqlWalker) public function getSql(SqlWalker $sqlWalker)
{ {
switch (strtolower($this->unit->value)) { switch (strtolower($this->unit->value)) {
case 'second':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubSecondsExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'minute':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubMinutesExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'hour': case 'hour':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubHourExpression( return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubHourExpression(
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
@ -50,16 +60,25 @@ class DateSubFunction extends DateAddFunction
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker) $this->intervalExpression->dispatch($sqlWalker)
); );
case 'week':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubWeeksExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'month': case 'month':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubMonthExpression( return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubMonthExpression(
$this->firstDateExpression->dispatch($sqlWalker), $this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker) $this->intervalExpression->dispatch($sqlWalker)
); );
case 'year':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubYearsExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
default: default:
throw QueryException::semanticalError( throw QueryException::semanticalError(
'DATE_SUB() only supports units of type hour, day and month.' 'DATE_SUB() only supports units of type second, minute, hour, day, week, month and year.'
); );
} }
} }

View File

@ -301,6 +301,24 @@ class QueryDqlFunctionTest extends OrmFunctionalTestCase
$this->assertTrue(strtotime($arg[0]['add']) > 0); $this->assertTrue(strtotime($arg[0]['add']) > 0);
} }
/**
* @group DDC-2938
*/
public function testDateAddTime(): void
{
$arg = $this->_em->createQuery("SELECT DATE_ADD(CURRENT_TIMESTAMP(), 10, 'second') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
->getArrayResult();
self::assertTrue(strtotime($arg[0]['add']) > 0);
$arg = $this->_em->createQuery("SELECT DATE_ADD(CURRENT_TIMESTAMP(), 10, 'minute') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
->getArrayResult();
self::assertTrue(strtotime($arg[0]['add']) > 0);
$arg = $this->_em->createQuery("SELECT DATE_ADD(CURRENT_TIMESTAMP(), 10, 'hour') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
->getArrayResult();
self::assertTrue(strtotime($arg[0]['add']) > 0);
}
public function testDateAddSecond() public function testDateAddSecond()
{ {
$dql = "SELECT CURRENT_TIMESTAMP() now, DATE_ADD(CURRENT_TIMESTAMP(), 10, 'second') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m"; $dql = "SELECT CURRENT_TIMESTAMP() now, DATE_ADD(CURRENT_TIMESTAMP(), 10, 'second') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m";
@ -334,6 +352,24 @@ class QueryDqlFunctionTest extends OrmFunctionalTestCase
$this->assertTrue(strtotime($arg[0]['add']) > 0); $this->assertTrue(strtotime($arg[0]['add']) > 0);
} }
/**
* @group DDC-2938
*/
public function testDateSubTime(): void
{
$arg = $this->_em->createQuery("SELECT DATE_SUB(CURRENT_TIMESTAMP(), 10, 'second') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
->getArrayResult();
self::assertTrue(strtotime($arg[0]['add']) > 0);
$arg = $this->_em->createQuery("SELECT DATE_SUB(CURRENT_TIMESTAMP(), 10, 'minute') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
->getArrayResult();
self::assertTrue(strtotime($arg[0]['add']) > 0);
$arg = $this->_em->createQuery("SELECT DATE_SUB(CURRENT_TIMESTAMP(), 10, 'hour') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
->getArrayResult();
self::assertTrue(strtotime($arg[0]['add']) > 0);
}
/** /**
* @group DDC-1213 * @group DDC-1213
*/ */