サーチ…


備考

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値は世界時で保存されTIMESTAMPDATEDATETIME値は、格納されている現地時間に関係なく格納されます。

サーバーのローカルタイムゾーンの設定は何ですか?

各サーバーには、サーバーマシンの所有者によって構成されたデフォルトのグローバル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のリストをインストールし、維持するために、サーバー管理者のために。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow