1
0
mirror of synced 2025-02-02 13:31:45 +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->intervalExpression->dispatch($sqlWalker)
);
case 'minute':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddMinutesExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'hour':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddHourExpression(
$this->firstDateExpression->dispatch($sqlWalker),
@ -62,16 +66,25 @@ class DateAddFunction extends FunctionNode
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'week':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddWeeksExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'month':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddMonthExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'year':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateAddYearsExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
default:
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)
{
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':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubHourExpression(
$this->firstDateExpression->dispatch($sqlWalker),
@ -50,16 +60,25 @@ class DateSubFunction extends DateAddFunction
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'week':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubWeeksExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'month':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubMonthExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
case 'year':
return $sqlWalker->getConnection()->getDatabasePlatform()->getDateSubYearsExpression(
$this->firstDateExpression->dispatch($sqlWalker),
$this->intervalExpression->dispatch($sqlWalker)
);
default:
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);
}
/**
* @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()
{
$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);
}
/**
* @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
*/