我有一个postgres事件表,其中事件时间存储在日期时间中,时区字段以UTC作为时区。实际时区存储在单独的字段中。
即。
id,event_time,time_zone
1,2013-10-15 10:32:21-05,'America / Chicago'
2,2013-10-15 9:32:21-05,'America / New York' 等
我想使用symfony2 / doctrine2查询构建器来选择落在以本地时间表示的特定日期范围内的事件。例如,我可能想在2013年10月15日当地时间下午4点到5点之间选择所有活动。
在postgres中我可以通过使用“AT TIME ZONE”功能来实现这一点。是否有任何类似的可用于doctrine的查询构建器(当然除了本机sql)。
即。 “SELECT * FROM events WHERE event_time AT TIME ZONE(time_zone)BETWEEN a AND b”
答案 0 :(得分:0)
我必须创建一个用户定义的函数:http://docs.doctrine-project.org/en/2.0.x/cookbook/dql-user-defined-functions.html
<?php
namespace MyOrganization\Bundle\MyBundle\DQL;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Parser;
/**
* AtTimeZoneFunction ::= "AT_TIME_ZONE" "(" ArithmeticPrimary "," ArithmeticPrimary ")"
*/
class AtTimeZone extends FunctionNode {
// (1)
public $dateExpression = null;
public $timezoneExpression = null;
public function parse(Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER); // (2)
$parser->match(Lexer::T_OPEN_PARENTHESIS); // (3)
$this->dateExpression = $parser->ArithmeticPrimary(); // (4)
$parser->match(Lexer::T_COMMA); // (5)
$this->timezoneExpression = $parser->ArithmeticPrimary(); // (6)
$parser->match(Lexer::T_CLOSE_PARENTHESIS); // (3)
}
public function getSql(SqlWalker $sqlWalker) {
return $this->dateExpression->dispatch($sqlWalker) . ' AT TIME ZONE ( '
. $this->timezoneExpression->dispatch($sqlWalker) .
')'; // (7)
}
}