• 日期時間類型包括date,time,datetime,timestamp和year,用來指定不同范圍的日期或時間值
• Date類型用來表示僅日期,MySQL默認的日期格式為yyyy-mm-dd,取值范圍為1000-01-01到9999-12-31
• Datetime類型用來表示日期和時間,MySQL默認的格式為yyyy-mm-dd hh:mi:ss,取值范圍為1000-01-01 00:00:00到9999-12-31 23:59:59
• Timestamp類型也用來表示日期和時間,其取值范圍為1970-01-01 00:00:01到2038-01-19 03:14:07
• Datetime和timestamp兩個類型都可以保存到微妙級別,即6位毫秒微妙精度,即1000-01-01 00:00:00.000000到9999-12-31 23:59:59.999999和1970-01-01 00:00:01.000000到2038-01-19 03:14:07.999999
• 非法的date,datetime,timestamp值將被轉換成0值,0000-00-00或者0000-00-00 00:00:00
mysql> select current_date(); +----------------+ | current_date() | +----------------+ | 2020-04-21 | +----------------+ 1 row in set (0.00 sec) mysql> select current_datetime(); ERROR 1305 (42000): FUNCTION course.current_datetime does not exist mysql> select now(); +---------------------+ | now() | +---------------------+ | 2020-04-21 21:40:48 | +---------------------+ 1 row in set (0.00 sec) mysql> create table temp5(tstamp datetime,tstamp2 timestamp); Query OK, 0 rows affected (0.17 sec) mysql> insert into temp5 values(now(),now()); Query OK, 1 row affected (0.04 sec) mysql> select * from temp5; +---------------------+---------------------+ | tstamp | tstamp2 | +---------------------+---------------------+ | 2020-04-21 21:42:31 | 2020-04-21 21:42:31 | +---------------------+---------------------+ 1 row in set (0.00 sec) mysql> insert into temp5 values('2020-04-22 21:45:10.321123',now()); Query OK, 1 row affected (0.01 sec) mysql> select * from temp5; +---------------------+---------------------+ | tstamp | tstamp2 | +---------------------+---------------------+ | 2020-04-21 21:42:31 | 2020-04-21 21:42:31 | | 2020-04-22 21:45:10 | 2020-04-21 21:45:13 | +---------------------+---------------------+ 2 rows in set (0.00 sec) mysql> drop table temp5; Query OK, 0 rows affected (0.08 sec) mysql> create table temp5(tstamp datetime(6),tstamp2 timestamp(3)); Query OK, 0 rows affected (0.11 sec) mysql> insert into temp5 values('2020-04-22 21:45:10.321123','2020-04-22 21:45:10.321123'); Query OK, 1 row affected (0.09 sec) mysql> select * from temp5; +----------------------------+-------------------------+ | tstamp | tstamp2 | +----------------------------+-------------------------+ | 2020-04-22 21:45:10.321123 | 2020-04-22 21:45:10.321 | +----------------------------+-------------------------+ 1 row in set (0.00 sec)
• Time類型用來僅表示時間,MySQL默認格式為HH:MM:SS,其取值范圍為-838:59:59到838:59:59,小時字段可以超過24是因為time類型不光代表小時,也可以代表持續時長中的小時
• Time類型也可以包含6位的毫秒微秒精度,其取值范圍為-838:59:59.000000到838:59:59.000000
• Year類型用來僅表示年份,MySQL默認格式為YYYY,其取值范圍為1901到2155,和0000
• 針對非法的year數據,則直接轉化為0000
mysql> select date_add(now(),interval 50 hour); +----------------------------------+ | date_add(now(),interval 50 hour) | +----------------------------------+ | 2020-04-23 23:52:01 | +----------------------------------+ 1 row in set (0.00 sec) mysql> select now(),date_add(now(),interval 50 hour); +---------------------+----------------------------------+ | now() | date_add(now(),interval 50 hour) | +---------------------+----------------------------------+ | 2020-04-21 21:52:14 | 2020-04-23 23:52:14 | +---------------------+----------------------------------+ 1 row in set (0.00 sec)
• Timestamp和datetime日期時間類型可以被自動初始化和更新為當前的日期時間數據,當你默認指定current timestamp為默認值,或者指定此數據列為自動更新時
• 指定默認值是指當插入新的數據而該列沒有顯視指定數值時,則插入當前日期時間值
• 指定自動更新是指當行中的其他列被更新時,則此列被自動更新為當前日期時間值
mysql> drop table temp5; Query OK, 0 rows affected (0.10 sec) mysql> create table temp5(id int,tstamp datetime default current_timestamp on update current_timestamp,tstamp2 timestamp default current_timestamp on update current_timestamp); Query OK, 0 rows affected (0.07 sec) mysql> alter table temp5 add name varchar(64); Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc temp5; +---------+-------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+-------------------+-----------------------------------------------+ | id | int(11) | YES | | NULL | | | tstamp | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | | tstamp2 | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | | name | varchar(64) | YES | | NULL | | +---------+-------------+------+-----+-------------------+-----------------------------------------------+ 4 rows in set (0.01 sec) mysql> select current_timestamp; +---------------------+ | current_timestamp | +---------------------+ | 2020-04-21 22:03:29 | +---------------------+ 1 row in set (0.01 sec) mysql> select now(); +---------------------+ | now() | +---------------------+ | 2020-04-21 22:03:35 | +---------------------+ 1 row in set (0.00 sec) mysql> select * from temp5; Empty set (0.00 sec) mysql> insert into temp5(id,name) values(1,'a'); Query OK, 1 row affected (0.04 sec) mysql> select * from temp5; +------+---------------------+---------------------+------+ | id | tstamp | tstamp2 | name | +------+---------------------+---------------------+------+ | 1 | 2020-04-21 22:05:11 | 2020-04-21 22:05:11 | a | +------+---------------------+---------------------+------+ 1 row in set (0.00 sec) mysql> insert into temp5(id,name) values(2,'b'); Query OK, 1 row affected (0.05 sec) mysql> select * from temp5; +------+---------------------+---------------------+------+ | id | tstamp | tstamp2 | name | +------+---------------------+---------------------+------+ | 1 | 2020-04-21 22:05:11 | 2020-04-21 22:05:11 | a | | 2 | 2020-04-21 22:05:43 | 2020-04-21 22:05:43 | b | +------+---------------------+---------------------+------+ 2 rows in set (0.00 sec) mysql> update temp5 set name='abc'; Query OK, 2 rows affected (0.07 sec) Rows matched: 2 Changed: 2 Warnings: 0 mysql> select * from temp5; +------+---------------------+---------------------+------+ | id | tstamp | tstamp2 | name | +------+---------------------+---------------------+------+ | 1 | 2020-04-21 22:06:05 | 2020-04-21 22:06:05 | abc | | 2 | 2020-04-21 22:06:05 | 2020-04-21 22:06:05 | abc | +------+---------------------+---------------------+------+ 2 rows in set (0.00 sec)
mysql> drop table temp5; Query OK, 0 rows affected (0.14 sec) mysql> create table temp5(id int,tstamp datetime default now()); Query OK, 0 rows affected (0.09 sec) mysql> desc temp5; +--------+----------+------+-----+-------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+-------------------+-------------------+ | id | int(11) | YES | | NULL | | | tstamp | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | +--------+----------+------+-----+-------------------+-------------------+ 2 rows in set (0.00 sec) mysql> drop table temp5; Query OK, 0 rows affected (0.13 sec) mysql> create table temp5(id int,tstamp datetime default date_add(now(),interval 1 day)); # 5.7版本及以前 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'date_add(now(),interval 1 day))' at line 1 mysql> select date_add(now(),interval 1 day); +--------------------------------+ | date_add(now(),interval 1 day) | +--------------------------------+ | 2020-04-22 22:11:52 | +--------------------------------+ 1 row in set (0.00 sec) mysql> create table temp5(id int,tstamp datetime default (date_add(now(),interval 1 day))); # 8.0版本 Query OK, 0 rows affected (0.16 sec) mysql> desc temp5; +--------+----------+------+-----+--------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+--------------------------+-------------------+ | id | int(11) | YES | | NULL | | | tstamp | datetime | YES | | (now() + interval 1 day) | DEFAULT_GENERATED | +--------+----------+------+-----+--------------------------+-------------------+ 2 rows in set (0.00 sec) mysql> insert into temp5(id) values(1); Query OK, 1 row affected (0.06 sec) mysql> select * from temp5; +------+---------------------+ | id | tstamp | +------+---------------------+ | 1 | 2020-04-22 22:13:27 | +------+---------------------+ 1 row in set (0.00 sec) mysql> drop table temp; Query OK, 0 rows affected (0.04 sec) mysql> create table temp(id int,id2 int default (1+1)); Query OK, 0 rows affected (0.13 sec) mysql> desc temp; +-------+---------+------+-----+---------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------------------+ | id | int(11) | YES | | NULL | | | id2 | int(11) | YES | | (1 + 1) | DEFAULT_GENERATED | +-------+---------+------+-----+---------+-------------------+ 2 rows in set (0.01 sec) mysql> insert into temp(id) values(10); Query OK, 1 row affected (0.08 sec) mysql> select * from temp; +------+------+ | id | id2 | +------+------+ | 10 | 2 | +------+------+ 1 row in set (0.00 sec)