简介:
本节介绍它们的特征,它们的相似之处以及它们的区别。
- 目录
MySQL 以多种格式识别DATE,DATETIME和TIMESTAMP值
日期类型 | 显示格式 | 显示值范围 | |
DATE | YYYY-MM-DD | 1000-01-01 到9999-12-31 | |
DATETIME | YYYY-MM-DD hh:mm:ss | 1000-01-01 00:00:00 到9999-12-31 23:59:59 | |
TIMESTAMP | YYYY-MM-DD hh:mm:ss | 1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 | 备注:MySQL不接受TIMESTAMP 在日期或月份列中包含零的值或不是有效日期的值。唯一的例外是特殊的“ 零 ”值 '0000-00-00 00:00:00' |
TIME | hh:mm:ss/hhh:mm:ss | -838:59:59 到 838:59:59 | 备注:小时部分可能很大,因为TIME 类型不仅可以用来表示一天中的时间(必须小于24小时),还可以用于表示两个事件之间的经过时间或时间间隔(可能远大于24)小时,甚至是负面的) |
UTC介绍:
协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
TIMESTAMP和DATETIME的自动初始化和更新
TIMESTAMP和 DATETIME列可以自动初始化并更新为当前日期和时间(即当前时间戳)。
对于表中的任何TIMESTAMP或 DATETIME列,您可以将当前时间戳分配为默认值,自动更新值或两者:
-
自动初始化列设置为插入行的当前时间戳,该列不指定列的值。
-
当行中任何其他列的值从其当前值更改时,自动更新列将自动更新为当前时间戳。如果所有其他列都设置为其当前值,则自动更新列保持不变。要防止在其他列更改时更新自动更新列,请将其明确设置为其当前值。要更新自动更新的列,即使其他列未更改,也要将其显式设置为应具有的值(例如,将其设置为 CURRENT_TIMESTAMP)。
TIMESTAMP或 DATETIME列定义可以指定默认值和自动更新值的当前时间戳,对于一个而不是另一个,或两者都不指定。不同的列可以具有不同的自动属性组合。以下规则描述了可能性:
-
使用
DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
,列具有其默认值的当前时间戳,并自动更新为当前时间戳。 -
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
-
使用
DEFAULT
子句但没有ON UPDATE CURRENT_TIMESTAMP
子句,该列具有给定的默认值,并且不会自动更新为当前时间戳。默认值取决于
DEFAULT
子句是指定CURRENT_TIMESTAMP
还是常量值。使用CURRENT_TIMESTAMP
,默认为当前时间戳。CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP );
TIMESTAMP和DATETIME的区别:
TIMESTAMP 存储空间比较小,表示的日期时间范围也比较小底层存储方式不同, TIMESTAMP 底层存储的是毫秒值,距离 1970-1-1 0:0:0 0 毫秒的毫秒值。两个日期比较大小或日期计算时, TIMESTAMP 更方便、更快。TIMESTAMP 和时区有关。 TIMESTAMP 会根据用户的时区不同,显示不同的结果。而 DATETIME 则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。