Mysql提供数据类型来存储不同种类的日期信息。在这term YYYY,MM,DD,hh,mm,and ss代表年,月,日 ,小时,分钟,和秒。
Type storage Required Range
Date 3bytes ‘1000-01-01’ to ‘9999-12-31’
Time 3bytes ‘-838:59:59’ to ‘838:59:59’
DATETIME 8bytes '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP 4bytes '1970-01-01 00:00:00' to mid-year 2037
YEAR 1bytes 1910 to 2155
这个0值表示一个格式0000-00-00对于DATE和‘00:00:00’对于TIME
日期的展示ISO 8610格式,可以改变显示方式使用DATE_FORMAT()函数
对于日期条目:MYsql 期望接收日期类型以ISO格式,或者至少是和ISO格式相近的,那就是说日期类型必须给year-month-day的顺序,尽管
1.开始的0在月和日值可以不忽略,例如2000-1-1 和2000-01-01都被认为是合法的
2.日期不符需要的不是'-';可以使用其他分隔如‘/';
3.两个数字的日期可以被转化为四个数字的年,你应该能够注意基于如下规则70到99代表1970年到1999,因此00到69代表2000到2069.它是更好的提供四个数字的值来避免转换
如果需要加载不能接受的格式,应该把他们转换为ISO格式。
5.5.1 这DATE,TIME,DATETIME,和YEAR 日期类型
Date数据类型代表日期值在’YYYY-MM-DD‘格式。Year数据类型仅仅代表年的值,你可以声称列为YEAR(4)或者YEAR(2)来获得一个4个数字或两个数字来展示格式。如果你没有指定展示宽度,默认器时4个数字。
5.5.2 这Timestamp数据类型
这timestamp类型存储日期和时间类型。内部存储是UTC,转换为目前时间区域。这TIMESTAMP数据类型可以被初始化或被自动更新到目前的日期和时间当没有明确的指定值。你可以指定任何单独timestamp列在表中应该被初始化用目前的时间当记录被创建使用insert或replace,被更新使用现在的时间当记录被改变使用update。
知道自动初始化和更新的特征是很重要的。
这个特征能够使用timestamp来跟踪记录修改的次数,但是可能是一个问题的源泉没有意思到初始化。
为了控制初始化和更新对于timestamp,你应该增加default current——timestamp和on update——timestamp属性在这timestamp列的定义当创建表和改变表时。这个default_timestamp属性引发被初始化使用被创建的时间。这个on update current_timestamp 属性引发列被更新使用目前时间当它被改变时。
为了兼容就版本的mysql,如果没有指定default和on的属性,mysql自动分配第一个timestamp列两个属性。
mysql> create table ts_test1(
-> ts1 timestamp,
-> ts2 timestamp,
-> data char(30)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> describe ts_test1;
+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------------------+-----------------------------+
| ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| ts2 | timestamp | NO | | 0000-00-00 00:00:00 | |
| data | char(30) | YES | | NULL |
mysql> insert into ts_test1(data) values('original_value');
Query OK, 1 row affected (0.03 sec)
mysql> select* from ts_test1;
+---------------------+---------------------+----------------+
| ts1 | ts2 | data |
+---------------------+---------------------+----------------+
| 2016-05-31 21:32:48 | 0000-00-00 00:00:00 | original_value |
+---------------------+---------------------+----------------+
update ts_test1 set data='updated_value';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select* from ts_test1;
+---------------------+---------------------+---------------+
| ts1 | ts2 | data |
+---------------------+---------------------+---------------+
| 2016-05-31 21:33:47 | 0000-00-00 00:00:00 | updated_value |
+---------------------+---------------------+---------------+
1 row in set (0.04 sec)
如果指定:
mysql> create table ts_test2(
-> created_time timestamp default current_timestamp,
-> data char(30)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> insert into ts_test2(data) values('original_value');
Query OK, 1 row affected (0.03 sec)
mysql> select* from ts_test2;
+---------------------+----------------+
| created_time | data |
+---------------------+----------------+
| 2016-05-31 21:36:42 | original_value |
+---------------------+----------------+
mysql> update ts_test2 set data='updated_value';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select* from ts_test2;
+---------------------+---------------+
| created_time | data |
+---------------------+---------------+
| 2016-05-31 21:36:42 | updated_value |
+---------------------+---------------+
更新也不变
mysql> create table ts_test3(
-> updated_time timestamp on update current_timestamp,
-> data char(30)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into ts_test3(data) values('original_value');
Query OK, 1 row affected (0.03 sec)
mysql> select * from ts_test3;
+---------------------+----------------+
| updated_time | data |
+---------------------+----------------+
| 0000-00-00 00:00:00 | original_value |
+---------------------+----------------+
1 row in set (0.03 sec)
mysql> update ts_test3 set data='updated_value';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from ts_test3;
+---------------------+---------------+
| updated_time | data |
+---------------------+---------------+
| 2016-05-31 21:42:52 | updated_value |
+---------------------+---------------+
你可以选择使用current_timestamp 不适用或者一个或者两个在一个timestamp列,但是不能使用default current_timestamp 在一列但是使用on update current——timestamp用在另外的一列。
可以使用如下达到目的:
mysql> create table ts_test5(
-> created timestamp default 0
-> ,
-> updated timestamp on update current_timestamp,
-> data char(30)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into ts_test5(created,data)
-> values(null,'original_value');
Query OK, 1 row affected (0.04 sec)
mysql> slect* from ts_test5;
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 'slect* from ts_test5' at line 1
mysql> select* from ts_test5;
+---------------------+---------------------+----------------+
| created | updated | data |
+---------------------+---------------------+----------------+
| 2016-05-31 21:53:04 | 0000-00-00 00:00:00 | original_value |
+---------------------+---------------------+----------------+
1 row in set (0.03 sec)
mysql> update ts_test5 set data='updated_value';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select* from ts_test5;
+---------------------+---------------------+---------------+
| created | updated | data |
+---------------------+---------------------+---------------+
| 2016-05-31 21:53:04 | 2016-05-31 21:53:48 | updated_value |
+---------------------+---------------------+---------------+