【问题标题】:Doctrine query select where date at time zone教义查询选择时区的日期
【发布时间】:2014-04-26 00:04:55
【问题描述】:

我有一个 postgres 事件表,其中事件时间存储在带有时区字段的日期时间中,时区为 UTC。实际时区存储在单独的字段中。

id, event_time, time_zone

1,2013-10-15 10:32:21-05,“美国/芝加哥”

2,2013-10-15 9:32:21-05,“美国/纽约” 等等

我想使用 symfony2/doctrine2 查询构建器来选择以当地时间表示的特定日期范围内的事件。例如,我可能想选择 2013 年 10 月 15 日当地时间下午 4 点到 5 点之间的所有事件。

在 postgres 中,我可以通过使用“AT TIME ZONE”功能来实现这一点。是否有任何类似的可用于教义的查询构建器(当然除了原生 sql)。

即"SELECT * FROM events WHERE event_time AT TIME ZONE(time_zone) BETWEEN a AND b"

【问题讨论】:

标签: php postgresql symfony doctrine-orm


【解决方案1】:

我必须创建一个用户定义的函数: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)
  }

}

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多