2016-06-21 6 views
0

私は現在、私のdatetimesをUTCで保存しています。しかし、今私は、今日のような特定の日に作成されたレコードを、自分のタイムゾーンであるEasternに照会したいと思っています。MySQL - "今日"作成されたレコードのクエリですが、日付はUTCにあります

時間の違いにより、私が作成しているレコードは明日の日付になります。たとえば、現在のタイムゾーンでは日付部分は2016-06-20ですが、UTCは2016-06-21です。

レコードがUTCとして保存されると、自分のタイムゾーンで特定の日のレコードを正確に取得する方法はありますか?私はconvert_tz関数を使用して保存された値をEasternに変換し、それをwhere節の一部として使用できると考えていました。そうすれば、日付は一致します。それは信頼できる解決策ですか?

+3

適切な場合は質問履歴にアクセスして回答を受け入れることができます。それは、誰かが答えたいと思う人のための有望な光景ではありません。 – Drew

+0

私は理解します。思い出してくれてありがとう。 – kenshin9

答えて

1

あなたはUTCに探している日時境界を変換するには次のようになります。

CONVERT_TZ関数が便利です。このような何か:

WHERE my_utc_date_time_col >= CONVERT('2016-02-20','EST5EDT','+00:00') 
    AND my_utc_date_time_col < CONVERT('2016-02-20','EST5EDT','+00:00') + INTERVAL 1 DAY 

(これは、あなたが、MySQLのタイムゾーンテーブルを埋めてきたので、名前のタイムゾーンがサポートされていることを前提としています。)

に効果的同等巻き上げる:

WHERE my_utc_date_time_col >= '2016-02-20' + INTERVAL 4 HOUR 
    AND my_utc_date_time_col < '2016-02-20' + INTERVAL 4 HOUR + INTERVAL 1 DAY 

または

WHERE my_utc_date_time_col >= '2016-02-20 04:00:00' 
    AND my_utc_date_time_col < '2016-02-21 04:00:00' 

あなたは関数を参照したい場合などNOW()現在の日付を取得するには、返されるdatetime値がMySQL接続のtime_zoneにあるため、MySQL接続のタイムゾーンが重要になります。私たちは、リテラル側ではなく、列に変換を行うことを好む

SHOW VARIABLES LIKE 'time_zone' ; 

注ので、私たちは内のすべての行の変換を実行するためにMySQLを強制的に列、でそれを行う場合テーブルを作成し、リテラルを比較します。リテラル側で変換を行うと、MySQLはインデックス範囲のスキャン操作(適切なインデックスを使用可能)を有効に使用することができます。

+0

入力いただきありがとうございます。私があなたが言及したものに類似した何かをしたので、私は文字通りの側で変換を行い、それを列と比較します。 – kenshin9

0

実際には、CONVERT_TZ機能が必要です。私は 東に格納された値を変換するために、convert_tz機能を使用して、私のwhere句の一部としてそれを使用することができ

:しかし、私はに反対します。 WHERE上の機能を使用すると、パフォーマンスが低下する可能性がありますので

ストアドプロシージャを使用している場合は、最初に入力日付を変換してから、SELECTステートメントで使用することをお勧めします。

SET @fromDate = CONVERT_TZ(@fromDate, ...) --Convert to UTC 
SET @toDate = CONVERT_TZ(@toDate, ...) --Convert to UTC 

SELECT * 
    FROM TableA A 
    WHERE A.FromDate BETWEEN @fromDate AND @toDate 
0

http://ee1.php.net/manual/en/class.datetime.php

$foo = new DateTime("today", new DateTimeZone("America/Vancouver")); 
var_dump($foo->format('c'), $foo->format('U')); 
$foo->setTimeZone(new DateTimeZone("UTC")); 
var_dump($foo->format('c'), $foo->format('U'), $foo->format('Y-m-d H:i:s')); 

出力:

string(25) "2016-06-20T00:00:00-07:00" 
string(10) "1466406000" 
string(25) "2016-06-20T07:00:00+00:00" 
string(10) "1466406000" 
string(19) "2016-06-20 07:00:00" 
関連する問題