日時またはタイムスタンプ

先日、多くの開発者がMySQLのDATETIMEデータ型とTIMESTAMPデータ型の違いを知らないという事実と、Webアプリケーションのユーザーごとに異なるタイムゾーンを考慮する必要がある場合の日付と時刻の格納方法に出会いました。 したがって、以下の説明で説明したいと思います。

日時
8バイトを使用して、YYYYMMDDHHMMSS形式の整数として時刻を保存します。 この時間はタイムゾーンから独立しています 。 MySQLで設定されているタイムゾーンに関係なく、保存時とまったく同じ方法でフェッチする場合は常に表示されます。 私は例を挙げます:

mysql> create table `dt1` ( col datetime NOT NULL );
mysql> SET @@session.time_zone='+00:00';
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 18:13:56 |
+---------------------+

mysql> insert into dt1 values(now());

mysql> SET @@session.time_zone='+01:00';
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 19:14:20 |
+---------------------+

mysql> insert into dt1 values(now());

mysql> SET @@session.time_zone='+00:00';
mysql> select * from dt1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:14:10 |
| 2009-06-04 19:14:27 |
+---------------------+


タイムスタンプ
グリニッジ標準時(つまり、タイムゾーンがゼロ、タイムゾーンの参照ポイント)に従って1970年1月1日の午前0時から経過した秒数に等しい4バイト整数を格納します。 データベースから受信すると、タイムゾーンを考慮して表示されます。 タイムゾーンは、オペレーティングシステム、MySQLのグローバル設定、または特定のセッションで設定できます。 秒数は常にローカルタイムゾーンではなく、UTC(グリニッジ子午線の協定世界時、太陽時)で保存されることに注意してください。 例:

mysql> create table tm1 (col timestamp not null);
mysql> set @@session.time_zone = '+00:00';
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 18:24:54 |
+---------------------+
mysql> insert into tm1 values(now());
mysql> select * from tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:25:08 |
+---------------------+

mysql> set @@session.time_zone = '+01:00';
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 19:25:21 |
+---------------------+
mysql> insert into tm1 values(now());
mysql> select * from tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 19:25:08 |
| 2009-06-04 19:25:26 |
+---------------------+

mysql> set @@session.time_zone = '+00:00';
mysql> select * from tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:25:08 |
| 2009-06-04 18:25:26 |
+---------------------+


別の違い! TIMESTAMPのデフォルトはNOT NULLで、デフォルト値はNOW()です。

mysql> insert into dt1 values(null);
ERROR 1048 (23000): Column 'col' cannot be null
mysql> insert into tm1 values(null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:25:08 |
| 2009-06-04 18:25:26 |
| 2009-06-04 18:32:50 |
+---------------------+


追加。 NOW()関数の使用に混乱している人向け。

mysql> set @@session.time_zone = '+00:00';
mysql> insert into dt1 values('2009-06-04 22:00:00');
mysql> set @@session.time_zone = '+01:00';
mysql> select * from dt1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 22:00:00 |
+---------------------+

mysql> set @@session.time_zone = '+00:00';
mysql> insert into tm1 values('2009-06-04 22:00:00');
mysql> set @@session.time_zone = '+01:00';
mysql> select * from tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 23:00:00 |
+---------------------+

Source: https://habr.com/ru/post/J61391/


All Articles