Appearance
类型 名称 字节 日期格式 最小值 最大值 YEAR 年 1 YYYY或YY 1901 2155 TIME 时间 3 HH:MM:SS -838:59:59 838:59:59 DATE 日期 3 YYYY-MM-DD 1000-01-01 9999-12-03 DATETIME 日期时间 8 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 TIMESTAMP 日期时间 4 YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:00 UTC 2038-01-19 03:14:07 UTC
为什么时间类型 TIME 的取值范围不是 -23:59:59~23:59:59 呢?原因是 MySQL 设计的 TIME 类型,不光表示一天之内的时间,而且可以用来表示一个时间间隔,这个时间间隔可以超过 24 小时。
YEAR
以 4 位字符串或数字格式表示时,格式为 YYYY,最小值为 1901,最大值为 2155。 以 2 位字符串或数字格式表示时
当取值为数字或字符串 01 到 69 时,表示 2001 到 2069。
当取值为数字或字符串 70 到 99 时,表示 1970 到 1999。
当为字符串 '0' 或 '00' 时,表示 2000 年。
当为数字 0 或 00,表示 0000 年。
sqlCREATE TABLE table_year ( x YEAR ); INSERT INTO table_year VALUES ('2021'), (2022), ('69'), ('70'), ('0'), (0), ('00'), (00);DATE
YYYY-MM-DD 或 YYYYMMDD YY-MM-DD 或 YYMMDD
sqlCREATE TABLE table_date ( x DATE ); INSERT INTO table_date VALUES ('2021-01-01'), ('20210101'), ('21-01-01'), ('210101'), # 存在隐式转换 (210101), (CURDATE()), (NOW());TIME
D HH:MM:SS
D 表示天,最小值为 0,最大值为 34。如果使用带有 D 格式的字符串,D会被转化为小时, HH 的值为 D * 24 + HH。
D HH:MM
D HH
HH:MM:SS
HH:MM
SS
HHMMSS
sqlCREATE TABLE table_time ( x TIME ); INSERT INTO table_time VALUES ('2 12:00:00'), ('12:00:00'), (NOW());DATETIME
YYYY-MM-DD HH:MM:SS 或 YYYYMMDDHHMMSS YY-MM-DD HH:MM:SS 或 YYMMDDHHMMSS
sqlCREATE TABLE table_datetime ( x DATETIME ); INSERT INTO table_datetime VALUES ('2021-01-01 12:00:00'), (CURTIME()), (NOW());TIMESTAMP
YYYY-MM-DD HH:MM:SS 或 YYYYMMDDHHMMSS YY-MM-DD HH:MM:SS 或 YYMMDDHHMMSS
存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时 区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。
sqlCREATE TABLE table_timestamp ( t1 DATETIME, t2 TIMESTAMP ); INSERT INTO table_timestamp VALUES ('2021-01-01 12:00:00', '2021-01-01 12:00:00'), (CURTIME(), CURTIME()), (NOW(), NOW()); SELECT * FROM table_timestamp; +---------------------+---------------------+ | t1 | t2 | +---------------------+---------------------+ | 2021-01-01 12:00:00 | 2021-01-01 12:00:00 | | 2022-09-11 20:41:07 | 2022-09-11 20:41:07 | | 2022-09-11 20:41:07 | 2022-09-11 20:41:07 | +---------------------+---------------------+ # 修改时区为东九区 SET time_zone = '+9:00'; # TIMESTAMP 类型显示该时间戳在东九区的时间 +---------------------+---------------------+ | t1 | t2 | +---------------------+---------------------+ | 2021-01-01 12:00:00 | 2021-01-01 13:00:00 | | 2022-09-11 20:41:07 | 2022-09-11 21:41:07 | | 2022-09-11 20:41:07 | 2022-09-11 21:41:07 | +---------------------+---------------------+
TIMESTAMP vs DATETIME的
TIMESTAMP 存储空间比较小,表示的日期时间范围也比较小。
底层存储方式不同,TIMESTAMP 底层存储的是毫秒值,距离 1970-1-1 0:0:0 0 毫秒的毫秒值。 两个日期比较大小或日期计算时,TIMESTAMP 更方便、更快。
TIMESTAMP 和时区有关。TIMESTAMP 会根据用户的时区不同,显示不同的结果。而 DATETIME 则只能反映出插入时当地的时区,其他时区的人查看数据会有误差的。
用得最多的日期时间类型,就是 DATETIME 。因为这个数据类型包括了完整的日期和时间信息,取 值范围也最大,使用起来比较方便。但一般存注册时间、商品发布时间等,不建议使用 DATETIME 存储,而是使用时间戳 ,因为 DATETIME 虽然直观,但不便于计算。