一、介绍
DATE:DATE
类型用于具有日期部分但没有时间部分的值。MySQL DATE
以'YYYY-MM-DD'
格式检索和显示 值 。支持的范围是 '1000-01-01'
到 '9999-12-31'
。
DATETIME:DATETIME
类型用于包含日期和时间部分的值。MySQL DATETIME
以'YYYY-MM-DD hh:mm:ss'
格式检索和显示 值。支持的范围是 '1000-01-01 00:00:00'
到'9999-12-31 23:59:59'
。
TIMESTAMP:TIMESTAMP
数据类型被用于同时包含日期和时间部分的值。 TIMESTAMP支持的
范围是'1970-01-01 00:00:01'
UTC到'2038-01-19 03:14:07'
UTC 。
注:因为DATE类型只包含日期部分,因此此处不做过多介绍,我们主要针对DATETIME和TIMESTAMP来研究
二、DATETIME和TIMESTAMP相同点
DATETIME和
TIMESTAMP
都可以跟小数部分(可以精确到微秒)。MySQL在插入到一个DATETIME
或一 TIMESTAMP
列时
,列中的值的任何小数部分都被存储而不是被丢弃。包含小数部分时,DATETIME和TIMESTAMP的格式都是'YYYY-MM-DD hh:mm:ss
[.fraction
]',小数部分应始终与其余时间使用小数点分隔。
三、DATETIME和TIMESTAMP不同点
DATETIME的范围是'1000-01-01 00:00:00.000000
' 到 '9999-12-31 23:59:59.999999
';
TIMESTAMP的范围是'1970-01-01 00:00:01.000000
' to '2038-01-19 03:14:07.999999
'。
MySQL将TIMESTAMP
当前时区的值转换为UTC进行存储,然后从UTC转换回当前时区进行检索。默认情况下,每个连接的当前时区是服务器的时间。可以基于每个连接设置时区。只要时区设置保持不变,您就会获得存储的相同值。如果存储TIMESTAMP
值,然后更改时区并检索值,则检索的值与存储的值不同。发生这种情况是因为在两个方向上都没有使用相同的时区进行转换。
四、实战
1.建表
create table test(timestamp timestamp(3), datetime datetime(3));
2.数据精确到毫秒
insert into test(timestamp , datetime) values(now(3), current_timestamp(3));
select * from test
结果如图:
注:MySQL中表现当前时间的方式有
CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()、NOW()、LOCALTIME、LOCALTIME()、LOCALTIMESTAMP、LOCALTIMESTAMP()
3.验证timestamp是将当前时区的值转化为UTC存储,而datetime不是
3.1查看当前时区
show variables like '%time_zone%';
3.2修改时区
set time_zone='+0:00';
3.3查看之前插入的记录,可以发下之前插入的记录timestamp少了8小时
4.验证TIMESTAMP与DATETIME时间范围不一样
4.1验证DATETIME
4.1.1未超出DATETIME范围,超出STIMESTAMP范围
insert into test(datetime) values('20501111000000.005');
结果如图:
4.1.2超出DATETIME范围
insert into test(datetime) values('100001111000000.005');
结果如图:
4.2验证STIMESTAMP
insert into test(timestamp) values ('20381212000000.007');
结果如图:
注:关于TIMESTAMP和DATETIME的自动初始化和更新下节更新