MySQLにそのような機能があるかどうか誰でも知っていますか?
UPDATE
これは有効な情報を出力しません。
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
あるいは、MySQL自体が使用されているtime_zone
を正確に認識できない可能性があります。PHP
...以外の有効な情報を取得できるのであれば、ここにSYSTEM
を含めることができます。
マニュアルから( セクション9.6 ):
グローバルおよびクライアント固有のタイムゾーンの現在の値は、次のように取得できます。
mysql> SELECT @@global.time_zone, @@session.time_zone;
編集 MySQLがシステムのタイムゾーンのスレーブに設定されている場合、上記はSYSTEM
を返します。 PHPを使用しているため、MySQLからの回答がSYSTEM
の場合、システムにit's via date_default_timezone_get
を使用して尋ねることができます。 (もちろん、VolkerKが指摘したように、PHPは別のサーバーで実行されている可能性がありますが、前提として、Webサーバーと通信先のDBサーバーがset to [実際にはinではない場合]同じタイムゾーンはhugeの飛躍ではありません。) MySQLと同様)、PHPが使用するタイムゾーンを設定できます( date_default_timezone_set
)。これは、OSが使用している値とは異なる値を報告する可能性があることを意味します。 PHPコードを管理している場合は、それを行っているかどうかを知って大丈夫です。
しかし、MySQLサーバーがどのタイムゾーンを使用しているかという疑問は、サーバーにどのタイムゾーンにあるかを尋ねると、データベース内のデータについてabsolutely nothingがわかるため、正反対かもしれません。詳細をお読みください:
さらなる議論:
サーバーを制御している場合は、もちろん、タイムゾーンが既知の量であることを確認できます。サーバーを制御していない場合は、connectionが使用するタイムゾーンを次のように設定できます。
set time_zone = '+00:00';
これにより、タイムゾーンがGMTに設定され、以降の操作(now()
など)でGMTが使用されるようになります。
ただし、時刻と日付の値は、MySQLのタイムゾーン情報とともにnotに格納されていることに注意してください。
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()
などのように、現在時刻を取得している関数に関してのみ重要です。データベースデータの日付が使用しているタイムゾーンについては何もわかりません。サーバーのタイムゾーンを使用して作成されたと仮定してassumeを選択することもできますが、その仮定には誤りがあるかもしれません。データに保存されている日付または時刻のタイムゾーンを知るには、それらがタイムゾーン情報とともに保存されていることを確認するか、(私が行うように)常にGMTになっていることを確認する必要があります。
サーバーのタイムゾーンを使用してデータが書き込まれたと仮定するのはなぜですか?まあ、一つには、異なるタイムゾーンを設定する接続を使用してデータが書き込まれた可能性があります。データベースは、サーバーが異なるタイムゾーンにある別のサーバーに移動された可能性があります(テキサスからカリフォルニアに移動したデータベースを継承したときに、そのサーバーに遭遇しました)。しかし、if ifデータは、現在のタイムゾーンでサーバーに書き込まれますが、依然としてあいまいです。昨年、米国では、夏時間は11月1日の午前2時にオフになりました。私のサーバーが太平洋時間帯を使用してカリフォルニアにあり、データベースに値2009-11-01 01:30:00
があるとします。それはいつのことですか?それは、11月1日午前1時30分(太平洋夏時間)、または11月1日午前1時30分(PST)(1時間後)でしたか?知る方法はまったくありません。道徳:常にGMTで日付/時刻を保存し(これはDSTを行いません)、必要に応じて必要なタイムゾーンに変換します。
以下のクエリは現在のセッションのタイムゾーンを返します。
select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
単にSELECT @@system_time_zone;
PST
(あるいはあなたのシステムに関連するものは何でも)を返します。
セッションのタイムゾーンを判断しようとしている場合は、次のクエリを使用できます。SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
システムのタイムゾーンと異なる場合は、セッションのタイムゾーンが返されます。
コメントに JakubVrána (作成者または Adminer and NotORM )のように記載されているので、TIME
で現在のタイムゾーンオフセットを選択します。
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
その日付のタイムゾーンが+2:00の場合、02:00:00
が返されます。
私はここでチートシートを作りました: MySQLのタイムゾーンはUTCに設定されるべきですか?
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
これは、正または負の時間を扱う整数としてタイムゾーンを返します(例:-6
)(ここでEXTRACT
が効力を発揮する場所:HOUR
関数のみが、負のタイムゾーンを正として返します)。
Mysqlの現在のタイムゾーンを取得するには、次のようにします。
Mysqlのタイムゾーンを変更したい場合は、次のようにします。1. SET GLOBAL time_zone = '+00:00' //これにより、UTCでmysqlのタイムゾーンが設定されます。 //これにより、あなたは特定のセッションのためだけにタイムゾーンを変更することができます。
MySQLサーバータイムゾーンサポート と system_time_zone
システム変数をチェックしてください。それは役立ちますか?
sec_to_time(TIME_TO_SEC(curtime())+ 48000)を選択してください。ここであなたはあなたの時間差をsecとして指定することができます
説明に記載されているコマンドは、サーバーのタイムゾーンをとることを示す "SYSTEM"を返します。これは私たちの問い合わせには役に立ちません。
次のクエリはタイムゾーンを理解するのに役立ちます
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;
上記のクエリでは、世界協定時刻(UTC)に関する時間間隔がわかります。だから、あなたは簡単にタイムゾーンを分析することができます。データベースのタイムゾーンがISTの場合、出力は5:30になります。
TC_TIMESTAMP
MySQLでは、UTC_TIMESTAMPは現在のUTCの日付と時刻を 'YYYY-MM-DD HH:MM:SS'またはYYYYMMDDHHMMSS.uuuuuuの形式で値として返します。つまり、文字列または数値のコンテキストです。
NOW()
NOW()関数MySQL NOW()は、関数のコンテキスト(数値または文字列)に応じて、現在の日時の値を 'YYYY-MM-DD HH:MM:SS'形式またはYYYYMMDDHHMMSS.uuuuuu形式で返します。 CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()、LOCALTIME、LOCALTIME()、LOCALTIMESTAMP、LOCALTIMESTAMP()は、NOW()の同義語です。
私のPHPフレームワークが使う
SET LOCAL time_zone='Whatever'
接続後にオンになります。 'Whatever' == date_default_timezone_get()
私の解決策ではありませんが、これはMySQLサーバのSYSTEM
タイムゾーンが常にPHPのものと同じであることを保証します
だから、はい、PHPは強く巻き込まれていてそれに影響を与える
タイムスタンプのあるデータベースにダミーレコードを挿入します。そのレコードを選択して、タイムスタンプの値を取得します。そのレコードを削除してください。サーバーがデータの書き込みに使用しているタイムゾーンを確実に取得し、PHPタイムゾーンを無視します。
Systemのタイムゾーンを変更した後は、mysqldを再起動するだけです。
MySQLのグローバルタイムゾーンはSystemのタイムゾーンを取ります。システムのそのような属性を変更したときは、Mysqldを再起動するだけです。
LPAD(TIME_FORMAT(TIMEDIFF(NOW()、UTC_TIMESTAMP)、 '%H:%i')、6、 '+')を使用して、CONVERT_TZ()で便利に使用できるMySQLのタイムゾーン形式の値を取得します。あなたが得るタイムゾーンオフセットは式が評価される瞬間にだけ有効であることに注意してください、あなたが夏時間があるならばオフセットは時間とともに変わるかもしれないので。しかし、この式は、オフセットを現地時間と一緒に格納するためにNOW()と一緒に使用すると便利です。これにより、NOW()の結果が明確になります。 (DSTタイムゾーンでは、NOW()は年に1回1時間戻ります。そのため、異なる時点で重複する値があります)。
あなたのタイムゾーンに従って現在の時刻を得るために、あなたは以下を使うことができます(私の場合は '+ 5:30')
dATE_FORMAT(convert_tz(now()、@@ session.time_zone、 '+ 05:30')、 '%Y-%m-%d')を選択してください。