datetime 和 timestamp 都是 MySQL 中的日期类型。
datetime 类型
以 YYYY-MM-DD HH:MM:SS[.fraction] 格局存储日期工夫:
datetime = YYYY-MM-DD HH:MM:SS
datetime(6) = YYYY-MM-DD HH:MM:SS.fraction
datetime 类型与时区无关 (其值不随时区变动),存储时占用 8 个字节。
timestamp 类型
存储自 1970 年 1 月 1 日到以后工夫的秒数,跟 datetime 相似,也以以 YYYY-MM-DD HH:MM:SS[.fraction] 格局展现。
timestamp 类型与时区无关,配置不同的时区时其值不同。
timestamp 存储时占用 4 个字节,工夫范畴:1970-01-01 ~ 2038-01-19。
timestamp 类型的字段,能够在 DDL 语义中定义主动批改 (ON UPDATE):
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
demo
次要演示 datetime 与 timestamp 随时区变动的状况。
设置以后时区:
mysql> set time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
创立表并插入数据:
//d1 datetime 类型;d2 timestamp 类型
mysql> create table t1(d1 datetime, d2 timestamp);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into t1 values(now(), now());
Query OK, 1 row affected (0.02 sec)
查看以后数据:
mysql> select * from t1;
+---------------------+---------------------+
| d1 | d2 |
+---------------------+---------------------+
| 2019-03-02 18:59:20 | 2019-03-02 18:59:20 |
+---------------------+---------------------+
1 row in set (0.01 sec)
批改时区:
mysql> set time_zone='+10:00';
Query OK, 0 rows affected (0.00 sec)
再查问表数据:
mysql> select * from t1;
+---------------------+---------------------+
| d1 | d2 |
+---------------------+---------------------+
| 2019-03-02 18:59:20 | 2019-03-02 20:59:20 |
+---------------------+---------------------+
1 row in set (0.00 sec)
能够看到 d1 datetime 类型,其值不随时区变动;而 d2 timestamp 其值追随时区变动。