日期时间类型中包含以下几种数据类型: 各类型都有具体的取值范围,超出或非法的其他值时,MySQL 会回退到 0。TIMESTAMP 类型是个例外,给它设置一个超出范围的值时,将保存上该类型允许的最大值。 MySQL 按标准格式 虽然 MySQL 支持多种格式进行日期时间的设置,但日期部分要求必须是 年-月-日 的形式才能正确解析。比如 年在只给了两位数的情况下,MySQL 尝试使用以下规则来补全:
所以,为了避免不可预测的结果,使用时还是指定全一些。
mysql> INSERT INTO todo (title,created_on) VALUES ('blah','2019-09-31'); ERROR 1292 (22007): Incorrect date value: '2019-09-31' for column 'created_on' at row 1 mysql> SET SESSION sql_mode = 'ALLOW_INVALID_DATES'; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO todo (title,created_on) VALUES ('blah','2019-09-31'); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> SELECT * FROM todo; +----+------+------------+ | id | title | created_on | +----+------+------------+ | 1 | blah | 2019-09-31 | +----+------+------------+ 1 rows in set (0.00 sec) 某些场景下你可能需要保存部分日期,比如用户只输入了年没输入月日。所以 MySQL 是支持将月日设置成 0,比如 除了月日可零,MySQL 还支持设置年月日都零的值 各日期时间零值格式如下,但实际时用时,直接简写成一个 0 效果是等效的。
DATE,DATETIME,及 TIMESTAMP三者具有相关性,都支持多种格式的自动解析,详见 Date and Time Literals。
既然如此,为何要使用这个取值范围更小的呢。
在写入时,对于非法的日期时间值,将自动存成零值,即 '0000-00-00' 或 '0000-00-00 00:00:00'。 关于日期时间需要注意的点:
日期时间的自动初始化及更新
两者可同时作用于一个日期时间列,表示插入记录时自动初始化成当前时间,后续记录更新时自动更新到当前时间。 其中
对于指定了自动初始化的列,插入时如果没指定该列的值,则会自动设置为当前的时间。 对于指定为自动更新的列,一旦一条记录中有字段变更,该日期会自动更新成变更时的时间。如果不想它更新,可在插入其他值时手动设置一下该日期列为原有的值,让其保持不变。
TIME时间 设置时也是支持将多种格式自动解析。对于带冒号的情况,比如 YEAR
支持使用以下格式进行设置:
相关资源 |
原文:MySQL 中的日期时间类型