web-dev-qa-db-ja.com

MySQLタイムスタンプのタイムゾーン処理

タイムスタンプデータタイプは、インスタントインタイムまたは年月日日付時分秒の値を表しますか?ある瞬間は、これを読み始めた瞬間のような瞬間であり、さまざまなy-m-d-h-m-s + timezone値で表すことができます。タイムゾーンがないとあいまいです。同じ瞬間が私にとっては17:25、他の誰かにとっては13:25になる可能性があります。

これが私が得たものだと思います。 current_timestamp関数は、現在のタイムゾーンの現在の時刻を返すため、これは明確な瞬間、つまり実際のnowです。テーブル内では、UTCとして格納されるため、この想定されるタイムゾーンでは、あいまいさもなくなるはずです。

さて、ここに私が得られないものがあります。それはutc_timestamp関数の存在です。 current_timestamputc_timestampを同じ列に格納しましたが、それらは異なっていました。この関数は存在するべきではなく、なぜ別の瞬間を表すのか理解できません。

6
fejesjoco

[〜#〜] timestamp [〜#〜]は、1970-01-01 00:00:01から現在までの秒数を格納します。データを取得すると、日付と時刻の形式に自動的に変換されます。

CURRENT_TIMESTAMP():タイムゾーンが設定された現在の日時を返します。 TC_TIMESTAMP():UTCタイムゾーンを使用して現在の日付と時刻を返します。

UTC以外のタイムゾーンを使用している場合、これらの関数は常に異なる値を返し、それ以外の場合は等しいです。

MySQLは常に日付と時刻をUTCで保存するため、さまざまなタイムゾーンに簡単に変換できます。 NOW()またはCURRENT_TIMESTAMP()は、日付/時刻と設定されたタイムゾーンを返します。

TC_TIMESTAMP()は、タイムゾーン設定を無視して日付/時刻を返します。

6
Erico

current_timestampを使用すると、MySQLはmy.cnfで設定されたタイムゾーンを使用します。 my.cnfに値が設定されていない場合、MySQLはオペレーティングシステムのタイムゾーンを決定し、起動時にそれを使用します。

このクエリでサーバーがどのように構成されているかを確認できます。

mysql> SELECT @@global.time_zone, @@session.time_zone;

また、セッションごとにタイムスタンプを設定することも可能です。

utc_timestampは、MySQLサーバーのタイムスタンプの構成に関係なく、常にUTCでタイムスタンプを取得するために使用されます。

2
nmad