MySQLの現在のタイムゾーンを取得するにはどうすればよいですか?


217

MySQLにそのような関数があるかどうか誰でも知っていますか?

更新

これは有効な情報を出力しません:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

または、MySQL自体がtime_zone使用されているものを正確に認識できない場合もありPHPますが、問題ありませんSYSTEM


3
「ここにPHPを含めることができます」-そして、そのphpのインスタンスは常にMySQLサーバーと同じマシン上にありますか?
VolkerK 2010年

はい、同じマシン上にあります。
user198729

10
@@system_time_zone以下の私の答えで述べられているようにしてみてください。
Andrew

質問が尋ねられたので、より多くの答えが追加されたので、おそらく受け入れられた答えを再考しますか?
Timo Huovinen、2014

1
MySQLサーバーとPHPは同じサーバー上にありますが、設定に基づいて異なるタイムゾーンを取得する場合があります。そして、これらの時間は、OSが示すものやPHP / MySQLが示すものとは異なる場合があります。
Bimal Poudel 2014

回答:


227

マニュアルから(セクション9.6):

グローバルおよびクライアント固有のタイムゾーンの現在の値は、次のようにして取得できます。
mysql> SELECT @@global.time_zone, @@session.time_zone;

編集上記はSYSTEM、MySQLがシステムのタイムゾーンのスレーブに設定されている場合に戻ります。これはあまり役に立ちません。あなたがPHPを使用しているので、MySQLのから答えがある場合、SYSTEMあなたは、どのようなタイムゾーンシステムを求めることができ、それはだ経由で使用しますdate_default_timezone_get。(もちろん、VolkerKが指摘したように、PHPは別のサーバーで実行されている可能性がありますが、想定されているように、それが通信しているWebサーバーとDBサーバー [実際はない場合]に設定されていると仮定すると、同じタイムゾーンは巨大な飛躍。)しかし、()MySQLのと同じように、あなたはPHPが使用するタイムゾーンを設定することができることを注意してください(date_default_timezone_set)、つまり、OSが使用している値とは異なる値を報告する可能性があります。PHPコードを制御している場合は、それを行っているかどうかを知って大丈夫である必要があります。

しかし、MySQLサーバーがどのタイムゾーンを使用しているかという問題全体が正接である可能性があります。サーバーにどのタイムゾーンが使用されているかを尋ねると、データベース内のデータについてまったく何もわかりません。詳細については以下をお読みください:

さらなる議論

サーバーを制御している場合は、もちろん、タイムゾーンが既知の量であることを確認できます。サーバーを制御できない場合は、接続で使用するタイムゾーンを次のように設定できます。

set time_zone = '+00:00';

これによりタイムゾーンがGMTに設定され、以降の操作(などnow())ではGMTが使用されます。

ただし、時刻と日付の値はタイムゾーン情報とともにMySQLに保存されないことに注意してください。

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

サーバーのタイムゾーンを知ることが、今の時間を取得する機能の面で重要なだけであるので、のようなnow()unix_timestamp()等。データベースデータの日付が使用しているタイムゾーンについては何もわかりません。あなたはすることを選択するかもしれないと仮定し、彼らは、サーバーのタイムゾーンを使用して書かれていたが、その前提は十分に欠陥があることがあります。データに格納されている日付または時刻のタイムゾーンを知るには、それらがタイムゾーン情報とともに格納されていることを確認するか、(私がしているように)常にGMTであることを確認する必要があります。

サーバーのタイムゾーンを使用してデータが書き込まれたと想定されるのはなぜですか?1つには、データは異なるタイムゾーンを設定する接続を使用して書き込まれた可能性があります。データベースが1つのサーバーから別のサーバーに移動された可能性があります。サーバーは異なるタイムゾーンにあります(テキサスからカリフォルニアに移動したデータベースを継承したとき、私はそれに遭遇しました)。しかし、場合でも、データが現在のタイムゾーンで、サーバー上で書かれている、それはまだ曖昧です。昨年、米国では、11月1日の午前2時にサマータイムがオフになりました。サーバーがカリフォルニアの太平洋時間帯を使用していて、値が2009-11-01 01:30:00データベース内。それはいつのことですか?11月1日の太平洋夏時間の午前1時30分、または11月1日の太平洋標準時の午前1時30分(1時間後)でしたか。あなたは知る方法が全くありません。道徳:日付/時刻は常にGMT(DSTを行わない)で保存し、必要に応じて、希望するタイムゾーンに変換します。


5
@ user198729:意味がありませんが、期待していたほど役に立ちません。それが何を意味するのか:OSに質問します。MySQLはそれに対応しています。
TJクラウダー、

気になるのは、なぜ自分でタイムゾーンを設定してから取得する必要があるのでしょうか。そういう目的を打ち負かすんじゃないですか?つまり、答えがわからないので、MySQLにタイムゾーンを尋ねたいのです。多分私は混乱していて、物事が間違っています。誰かが説明できますか?
Senthil、

1
@Senthil mySQL DATETIMEタイプにはタイムゾーン情報が含まれていません。したがって、ここで意図する基本的な哲学は、mySQLが可能な限りタイムゾーンブラインドになることであると考えています。つまり、ユーザーはUTCまたはサーバーのタイムゾーンのいずれか1つのタイムゾーンに固執し、そのゾーンにすべてを格納します。アプリケーションレベルで、またはCONVERT_TZ()dev.mysql.com/doc/refman/5.0/en/…)を使用して変換を行います。少なくとも、このようにして、このフィールドでmySQLが提供する疎オプションを見て、それがどのように機能するかを常に理解していました。
ペッカ

ありがとう、しかしこれはまだ解決されていません。PHPの結果からtz情報を取得するにはどうすればよいnow()ですか?
user198729、

「タイムスタンプを保存するときに1つのタイムゾーンに固執する」部分に完全に同意します。しかし、これはどのようにしてわかりますか。すべてのタイムスタンプ値をUTCとして保存したとしましょう。しかし、サーバーが別のタイムゾーンにあり、そのタイムゾーンに従ってタイムスタンプ値を表示したいとします。では、サーバーがどのタイムゾーンにあるかをどのようにして知るのでしょうか。そうして初めて、値をCONVERT_TZ()に渡して正しく変換できますか?
Senthilの

196

以下のクエリは、現在のセッションのタイムゾーンを返します。

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));

6
'SYSTEM'が変換のタイムゾーンとして認識され、たとえばNOW()を任意のタイムゾーンに変換するのに十分であることを示しているので、これは本当に正しい答えです。
nilskp

5
:おかげで、このIを使用すると、私が欲しかったフォーマットを取得することができましたselect time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)簡単です。
JakubVrána13年

3
またはSELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);、秒単位の違いを取得します。
philfreo

106

単に SELECT @@system_time_zone;

戻り値PST(またはシステムに関連するもの)。

セッションのタイムゾーンを特定しようとしている場合は、次のクエリを使用できます。
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

システムのタイムゾーンと異なる場合、セッションのタイムゾーンを返します。


6
唯一の欠点は、夏時間の変更によりタイムゾーンが変更された場合でも、サーバーの起動時に「記憶された」タイムゾーンが報告されることです。mysqlバグ9518
マーク

72

以下のようジェイカブ・ブラーナ(作成者またはAdminerNotORMは)現在のオフセットのタイムゾーンを選択し、コメントで言及TIME使用を:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

返され02:00:00ます:その日のタイムゾーンが+2:00の場合

ここでチートシートを作成しました:MySQLのタイムゾーンをUTCに設定する必要がありますか?


またはSELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);、秒単位の違いを取得します。
philfreo

@philfreoへのアドオン-TIMEDIFFではなくTIMESTAMPDIFFでパラメーターを逆にする必要があることに注意してください。TIMEDIFF戻りがあれば、この回答で与えられた例を取るために02:00:00、対応するTIMESTAMPDIFFが返される-2単位がHOURである場合、-120ユニットが微小である場合などタイムゾーンに対応するように記号を取得するには、パラメータを交換:SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())期待が返される120タイムゾーンのために+2:00。分を指定する理由は、30または45分のオフセットがあるいくつかのタイムゾーンがあるためです。en.wikipedia.org
wiki /

1
これは、質問に直接回答し、理論だけでなく解決策を提供するため、受け入れられた回答よりもはるかに優れた回答です。
supersan

10

mysqlの現在のタイムゾーンを取得するには、次のことを実行できます。

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

mysqlのタイムゾーンを変更する場合は、次のようにします。

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 

6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

これはタイムゾーンを整数(例:)として返し、-6正または負の時間を処理します(ここで機能EXTRACTするのは、HOUR関数のみが負のタイムゾーンを正として返す)です。


6

誰もがmysql dbのタイムゾーンを見つけに来ます。

このクエリを使用すると、現在のタイムゾーンを取得できます。

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

4

説明に記載されているコマンドは、サーバーのタイムゾーンを使用することを示す「SYSTEM」を返します。これは、クエリには役立ちません。

次のクエリは、タイムゾーンを理解するのに役立ちます

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

上記のクエリは、協定世界時(UTC)に関する時間間隔を提供します。したがって、タイムゾーンを簡単に分析できます。データベースのタイムゾーンがISTの場合、出力は5:30になります。

UTC_TIMESTAMP

MySQLでは、UTC_TIMESTAMPは現在のUTC日付と時刻を、関数の使用方法(文字列または数値コンテキスト)に応じて、 'YYYY-MM-DD HH:MM:SS'またはYYYYMMDDHHMMSS.uuuuuu形式の値として返します。

今()

NOW()関数。MySQL NOW()は、関数のコンテキスト(数値または文字列)に応じて、現在の日付と時刻の値を 'YYYY-MM-DD HH:MM:SS'形式またはYYYYMMDDHHMMSS.uuuuuu形式で返します。CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()、LOCALTIME、LOCALTIME()、LOCALTIMESTAMP、LOCALTIMESTAMP()はNOW()の同義語です。


2

MySQLサーバーのタイムゾーンサポートsystem_time_zoneシステム変数を確認してください。それは役に立ちますか?


@ユーザーは、正確に探している情報(サーバーのタイムゾーン?クライアントのタイムゾーン)と、どのツールを自由に使用できるかを質問で詳しく説明できますか?あなたはPHPについて言及しています。コマンドラインにアクセスできますか?
Pekka、

5
@userも、あなたが参考にしようとしている人たちからの答えを少しだけ気にしていて、正確に間違っているわけではないことに気づきました。私は投票も失点も気にしませんが、あなたの態度は解決策を探すことを奨励するものではありません。
ペッカ

3
@ユーザーが言ったように、あなたの態度は、特にあなたが提供する貧弱な情報に照らして、私があなたのためにさらなる答えを研究する動機付けにはなりません。ごめんなさい。
Pekka

3
@ user198729:うわー、態度を失います。ペッカは本当に人を助けるような人です。礼儀だけではモチベーションを上げるのに十分でない場合は、自己利益を試してください。
TJクラウダー、

2
ちょうど私の考え:ユーザーが私の投稿に対して同じことを行っていたとしても、私は気分を害することはなかったでしょう。つまり、締め切りのプレッシャーやフラストレーションは、人々の周りにいくつかの荒削りな要素を追加しますが、ある程度は許容する必要があると思います。多分私は寛容すぎる:|
Senthilの

1

私のPHPフレームワークは

SET LOCAL time_zone='Whatever'

接続後、ここで 'Whatever' == date_default_timezone_get()

私の解決策ではありませんが、これによりSYSTEMMySQLサーバーのタイムゾーンは常にPHPのタイムゾーンと同じになります

そのため、はい、PHPは強く進化しており、影響を与える可能性があります


1

あなたのタイムゾーンに従って現在の時刻を取得するには、次を使用できます(私の場合は「+5:30」)

DATE_FORMAT(convert_tz(now()、@@ session.time_zone、 '+ 05:30')、 '%Y-%m-%d')を選択します


0

システムのタイムゾーンを変更した後、mysqldを再起動するだけです。

MySQLのグローバルタイムゾーンは、システムのタイムゾーンを取ります。そのようなシステムの属性を変更した場合は、Mysqldを再起動するだけです。


OSのタイムゾーンを変更した後、mysql挿入は新しいタイムゾーンを使用しますが、now()を選択します。そしてcurrent_timestampを選択します。コマンドは引き続き古いタイムゾーンを使用します。これらすべてを同期するには、mysqlサービスを再起動する必要があります。
Manoj Kumar G

0

タイムスタンプを持つデータベースの1つにダミーレコードを挿入しますそのレコードを選択し、タイムスタンプの値を取得します。そのレコードを削除します。サーバーがデータの書き込みに使用しているタイムゾーンを確実に取得し、PHPタイムゾーンを無視します。


0

以下を試すことができます。

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

ここでは、時差を秒単位で指定できます


1
オフセットを加算および減算しないでください。ルールなどを言う日光のある地雷原
eweb

0

LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')便利に使用できるMySQLのタイムゾーン形式の値を取得するために使用しCONVERT_TZ()ます。取得するタイムゾーンオフセットは、式が評価される時点でのみ有効であることに注意してください。夏時間がある場合、オフセットは時間とともに変化する可能性があるためです。しかし、この式はNOW()、ローカル時間とのオフセットを保存するのに役立ちNOW()ます。これにより、結果が明確になります。(DSTタイムゾーンでNOW()は、年に1回1時間前に戻るため、異なる時点の値が重複しています)。


0

そうかも知れない

select timediff(current_time(),utc_time())

この方法でタイムゾーン値を直接取得することはできません。

@@global.time_zone変数なので使用できず、値を返します'SYSTEM'

を使用してタイムゾーンが変更されたセッションでクエリを使用する必要がある場合は session SET TIME_ZONE =、でそれを取得し@@session.time_zoneます。クエリすると@@global.time_zone、次のようになり'SYSTEM'ます。

あなたがしようとした場合datediffdate_subまたはtimediffnow()してutc_time()、あなたはおそらく変換の問題に実行されます。

しかし、上記で提案されていることは、おそらくいくつかのサーバーバージョンで動作するでしょう。私のバージョンは5.5.43-37で、ホストされたソリューションです。


これは質問に対する明確な回答にはなりません。おそらくあなたはそれを編集して、尋ねられた質問に集中することができます
Mogsdad 2015年

-3

次のコードを使用してみてください:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.