Doctrine查询选择时区中的日期

时间:2014-04-26 00:04:55

标签: php postgresql symfony doctrine-orm

我有一个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”

1 个答案:

答案 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)
  }

}