MySQL
タイムゾーンの処理
サーチ…
備考
MySQLの世界的なユーザーベースの時刻情報を処理する必要がある場合は、テーブルにTIMESTAMPデータ型を使用します。
ユーザーごとに、ユーザー設定タイムゾーン列を格納します。 VARCHAR(64)は、その列の適切なデータ型です。ユーザーがシステムに登録すると、タイムゾーンの値を尋ねます。私のものはAtlantic Time、 America/Edmonton
です。あなたは、 Asia/Kolkata
またはAustralia/NSW
場合もあれば、そうでない場合もあります。このユーザー設定のユーザーインターフェイスには、WordPress.orgソフトウェアが良い例です。
最後に、ユーザーの代わりにホストプログラム(Java、PHPなど)からDBMSへの接続を確立するたびに、SQLコマンドを発行します
SET SESSION time_zone='(whatever tz string the user gave you)'
ユーザーデータの処理に時間がかかることがあります。インストールしたTIMESTAMP
時間はすべて、ユーザーの現地時間で表示されます。
これにより、テーブルに入るすべての時間がUTCに変換され、すべての時間がローカルに変換されます。それはNOW()とCURDATE()に対して正しく機能します。この場合も、DATETIMEまたはDATEデータ型ではなく、TIMESTAMPを使用する必要があります。
サーバーのOSとデフォルトのMySQLタイムゾーンがUTCに設定されていることを確認してください。情報をデータベースにロードする前にこれを行わなければ、修正することはほとんど不可能です。ベンダーを使用してMySQLを実行する場合は、この権利を取得することを主張します。
特定のタイムゾーンで現在の日付と時刻を取得します。
これにより、現地時間、インド標準時、およびUTCでのNOW()
値が取得されます。
SELECT NOW();
SET time_zone='Asia/Kolkata';
SELECT NOW();
SET time_zone='UTC';
SELECT NOW();
格納された `DATE`または` DATETIME`値を別のタイムゾーンに変換します。
格納されているDATE
またはDATETIME
(カラムのどこかにある)があるタイムゾーンに関して保存されていたのですが、MySQLではタイムゾーンに値が格納されていません 。したがって、別のタイムゾーンに変換する場合は元のタイムゾーンを知っている必要があります。 CONVERT_TZ()
を使用すると変換が行われます。この例は、現地時間でカリフォルニアで販売されている行を示しています。
SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
FROM sales
WHERE state_sold = 'CA'
特定のタイムゾーンで保存された `TIMESTAMP`値を取得する
これは本当に簡単です。すべてのTIMESTAMP
値は世界時で保存され、レンダリングされるたびに常に現在のtime_zone
設定に変換されます。
SET SESSION time_zone='America/Los_Angeles';
SELECT timestamp_sold
FROM sales
WHERE state_sold = 'CA'
どうしてこれなの? TIMESTAMP
値は、由緒正しいUNIXのtime_t
データ型に基づいています 。これらのUNIXタイムスタンプは、 1970-01-01 00:00:00
UTC以降の秒数で保存され1970-01-01 00:00:00
。
通知 TIMESTAMP
値は世界時で保存されTIMESTAMP
。 DATE
とDATETIME
値は、格納されている現地時間に関係なく格納されます。
サーバーのローカルタイムゾーンの設定は何ですか?
各サーバーには、サーバーマシンの所有者によって構成されたデフォルトのグローバルtime_zone設定があります。この方法で現在のタイムゾーンを設定することができます:
SELECT @@time_zone
残念なことに、これは通常、値SYSTEM
生成します。つまり、MySQLの時刻はサーバーOSのタイムゾーン設定によって管理されます。
この一連のクエリ(はい、 ハック )は、サーバーのタイムゾーン設定とUTCの間のオフセットを分単位で返します。
CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;
これはどのように作動しますか?異なるデータ型を持つ一時テーブルの2つの列がヒントです。 DATETIME
データ型は常に現地時間でテーブルに格納され、 TIMESTAMP
はUTCで格納されTIMESTAMP
。したがって、time_zoneがUTCに設定されたときに実行されるINSERT
文は、2つの同一の日付/時刻値を格納します。
次に、SELECTステートメントは、time_zoneがサーバーの現地時間に設定されているときに実行されます。 TIMESTAMP
は常に、格納されているUTC形式からSELECTステートメントのローカル時間に変換されます。 DATETIME
はそうではありません。したがって、 TIMESTAMPDIFF(MINUTE...)
操作は、ローカル時刻と世界時刻の差を計算します。
サーバーで使用できるtime_zoneの値は何ですか?
MySQLサーバインスタンスでtime_zone値のリストを取得するには、このコマンドを使用します。
SELECT mysql.time_zone_name.name
通常、これは、Paul EggertによってInternet Assigned Numbers Authorityで管理されているタイムゾーンのZoneInfoリストを示しています 。世界中に約600のタイムゾーンがあります。
UNIXのようなオペレーティングシステム(Linuxディストリビューション、BSDディストリビューション、現代のMac OSディストリビューションなど)は、定期的なアップデートを受け取ります。これらの更新をオペレーティングシステムにインストールすると、そこで実行されているMySQLインスタンスが、タイムゾーンおよび昼光/標準時間の変更の変更を追跡できます。
はるかに短いタイムゾーン名のリストを取得すると、サーバーが不完全に構成されているか、Windowsで実行されています。 ここで説明されている zoneinfoのリストをインストールし、維持するために、サーバー管理者のために。