2014-04-26 67 views
0

我有一個事件時間表的事件時間存儲在日期時間與UTC時區的時區字段的事件表。實際時區存儲在單獨的字段中。學說查詢選擇時區的日期時間

ID,EVENT_TIME,的time_zone

1,2013-10-15 10:32:21-05, '美國/芝加哥'

2,2013-10-15 9 :32:21-05,'America/New York' 等

我想使用symfony2/doctrine2查詢生成器來選擇在本地時間表示的某個日期範圍內的事件。例如,我可能想在2013年10月15日當地時間下午4點至5點之間選擇所有活動。

在postgres中,我可以通過使用「AT TIME ZONE」功能來實現此功能。有什麼類似的可用於教條的查詢生成器(當然除了當然sql)。

即 「SELECT * FROM事件WHERE EVENT_TIME AT TIME ZONE(TIME_ZONE)A和B之間」

+0

我不知道,如果它目前存在,但如果不存在,您可以自己創建它,如http://docs.doctrine-project.org/en/2.0.x/reference/basic-mapping.html#custom-mapping-types中所述 – qooplmao

回答

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

}