15

MySQL (InnoDB) DB でいくつかの TIMESTAMP フィールドを INT に変換する必要があります。TIMESTAMP を INT に変換するのは珍しいことだと思いますが、それでもそれを行う必要があります :)

簡単に実行できるように見えますが、タイムゾーンと夏時間のエラーがいくつかあります。

列ごとに SQL コードを生成するスクリプトがあります。たとえば、次のように生成されます。

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;

を使用して前後のデータを比較するとselect FROM_UNIXTIME(1291788036);、結果は良好に見えます。

次に、すべてのクライアント側ソフトウェアを変更して UTC に変換し、保存時にその INT を使用するという考え方です。取得時に、その INT は現在のタイム ゾーンに変換されます。

しかし、その後、ドキュメントはこのシナリオについて警告します (CET での夏時間):

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 オフセットを指定するためにデータベースにフィールドを追加する唯一の解決策はありますか?

4

1 に答える 1