web-dev-qa-db-ja.com

MySQLは保存されたUTC時間をローカルタイムゾーンに変換できますか?

MySQLは、通常のselectステートメントで、保存されているUTC時間をローカルのタイムゾーンに直接変換できますか?

タイムスタンプ(UTC)付きのデータがあるとします。

CREATE TABLE `SomeDateTable` (
  `id`    int(11) NOT NULL auto_increment,
  `value` float NOT NULL default '0',
  `date`  datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)

それから私が

"select value, date from SomeDateTable";

もちろん、保存されているUTC形式のようにすべての日付を取得します。

しかし、別のタイムゾーン(DSTを使用)でそれらを使用したい場合、選択クエリに魔法を追加して、選択したタイムゾーンですべての日付を取得できますか?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";

または、PHPコードのように、他のレイヤーでこれを行う必要がありますか? (ほとんどの人がこの問題を解決した方法のようです)。

ありがとうヨハン


MySQLのインストールでCONVERT_TZを使用できる場合、これは非常にクリーンなソリューションです。この例では、その使用方法を示します。

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )

しかし、MySQLのインストールにはこの機能が欠けているため、これが良い方法かどうかはわかりません。注意して使用してください。

47
Johan
32
Stephen Fischer

Mysql環境を設定できない場合(たとえば、SUPERアクセスがないため)、「America/Denver」や「GMT」などの人間に優しいタイムゾーン名を使用するには、次のような数値オフセットで関数を使用することもできます。

CONVERT_TZ(date,'+00:00','-07:00')
25
tmsimont
select convert_tz(now(),@@session.time_zone,'+03:00')

時間を取得するには、次を使用します。

time(convert_tz(now(),@@session.time_zone,'+03:00'))
9
Jestin

使用することを提案します

SET time_zone = 'proper timezone';

データベースに接続した直後に一度行われます。この後、すべてのタイムスタンプは選択時に自動的に変換されます。

2
zerkms

DATETIMEデータ型でどのような計算ができるかはわかりませんが、PHPを使用している場合は、整数ベースのタイムスタンプを使用することを強くお勧めします。基本的に、PHPのtime()関数を使用して、データベースに4バイト整数を保存できます。これにより、計算がはるかに簡単になります。

0
TheBuzzSaw

簡単に使用できます

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')

例えば:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')

PlusこれはWHEREステートメントでも使用でき、タイムスタンプを比較するために、Where句で次を使用します。

WHERE CONVERT_TZ(timeperiod, 'UTC', '{$this->timezone}') NOT BETWEEN {$timeperiods['today_start']} AND {$timeperiods['today_end']}
0
MR_AMDEV