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のインストールにはこの機能が欠けているため、これが良い方法かどうかはわかりません。注意して使用してください。
Mysql環境を設定できない場合(たとえば、SUPERアクセスがないため)、「America/Denver」や「GMT」などの人間に優しいタイムゾーン名を使用するには、次のような数値オフセットで関数を使用することもできます。
CONVERT_TZ(date,'+00:00','-07:00')
select convert_tz(now(),@@session.time_zone,'+03:00')
時間を取得するには、次を使用します。
time(convert_tz(now(),@@session.time_zone,'+03:00'))
使用することを提案します
SET time_zone = 'proper timezone';
データベースに接続した直後に一度行われます。この後、すべてのタイムスタンプは選択時に自動的に変換されます。
DATETIMEデータ型でどのような計算ができるかはわかりませんが、PHPを使用している場合は、整数ベースのタイムスタンプを使用することを強くお勧めします。基本的に、PHPのtime()関数を使用して、データベースに4バイト整数を保存できます。これにより、計算がはるかに簡単になります。
簡単に使用できます
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']}