2013-08-07 12 views
5

私たちのMySQL(InnoDB)DBでは、TIMESTAMPフィールドをINTに変換する必要があります。私はTIMESTAMPをINTに変換することは珍しいことに気づいていますが、それでもやる必要があります。TIMESTAMPからINTEGERに変換するMysql - タイムゾーン

これは簡単なことですが、タイムゾーンや夏時間エラーがあります。

私はSQLコードを列ごとに生成するスクリプトを持っています。例えば、それが生成する:私は前とselect FROM_UNIXTIME(1291788036);を使用してデータの後に比較すると

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; 
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); 
ALTER TABLE alarmLog DROP started; 
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0; 

、結果はよさそうです。

考えてみると、すべてのクライアント側のソフトウェアをUTCに変換し、そのINTを使用して格納することです。取得するとき、そのINTは現在のタイムゾーンに変換されます。

しかし、このシナリオ(CETで夏時間)に関するドキュメントwarn me

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 02:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 03:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

どのAPIやOSのは、通常、夏時間に対処するのですか?私のPCは、夏時間にUTCで時計を持っていることが分かっていますが、OSには2時間が追加され、冬には1時間追加されます。私はそれがDSTかどうかを判断するためにUTC時間を使用すると仮定します。

どうすればこの問題に対処できますか? DSTオフセットを指定するためのフィールドをデータベースに追加する唯一のソリューションですか?

+1

サマータイムは異なるタイムゾーンです。例えば。 CETは中央ヨーロッパ時間、CESTは中央ヨーロッパ夏時間です。お使いのOSは、いつ切り替えるべきかを知っています。タイムスタンプにUTCを使用している限り、ローカルタイムに変換するのはプレゼンテーションレイヤーまでです。 –

答えて

3

INTの時刻を保存する必要はありません。とにかくMySQLのTIMESTAMP型はそれを行います(標準のUNIXタイムスタンプを使って時刻を格納します)。それらは常にUTCです。

セッションタイムゾーンを設定するだけで、すべてのTIMESTAMP列が更新/選択時にゾーンから/に変換されます。

あなたは一度接続/初期化時にゾーンを設定することができます。私は非常に精通していないよ

SET time_zone = '+10:00'; 

をそして、あなたはあなたのゾーンで時刻を更新/直接

​​

を選択することができますdatetimeのlibsしかし、私は彼らがタイムゾーンと夏時間のオフセットを決定するためにあなたが提供したタイムゾーンと問題の時間を使用すると思います。

あなたが提供した例では、時計は01:59:59から03:00:00にジャンプし、02:00:00は実際に起こったことがないため、値の1つが実際に無効であると思います。この場合、UNIX_TIMESTAMP関数はおそらく最も近い秒を返します。

+0

私はタイムスタンプを使うことができますが、私はそのタイプを使うことはできません。クライアント側はsqliteと互換性がある必要があります。そのため、INTへの変換が行われます。そして無効な時間について。昼間の終わりには、同じ問題を抱える特定の時間を1日2回節約します。 – Halfgaar

+0

複数の時点が同じ文字列表現であり、ギャップもあります。私はそれについてあなたができることは何もないと思います。 Unixのタイムスタンプ(INT)として値を保存し、MySQLの関数またはタイムライブラリのクライアント側で現地時間に変換します。タイムゾーンを正しく設定している限り、正しく表示されるはずです。 – Vatev

+0

私はちょうど '2005-03-27 02:00:00'をTIMESTAMP列に挿入してテストしました。それを取得することもあなたに '2005-03-27 03:00:00'を与える​​ので、それはうまくいくと思います。 – Halfgaar

関連する問題