MySQL中提供了多种用于表示日期和时间的数据类型,不同数据类型在存储能力、精度、时区支持等方面各有特点,开发者需要根据业务场景选择合适的类型,避免存储浪费或者功能缺失。

MySQL常见日期数据类型介绍
DATE类型
DATE类型仅用于存储日期信息,不包含具体的时间部分,格式为YYYY-MM-DD。它的取值范围是1000-01-01到9999-12-31,占用3个字节的存储空间。
这种类型适合只需要记录日期不需要时间的场景,比如用户的出生日期、订单的签约日期、活动的开始日期等。
TIME类型
TIME类型用于存储时间信息,不包含日期部分,格式为HH:MM:SS,取值范围是-838:59:59到838:59:59,占用3个字节。它不仅可以表示一天内的时间,还可以表示两个时间点之间的时间间隔。
适用场景比如记录课程的上课时长、员工的打卡工时、任务的耗时等。
DATETIME类型
DATETIME类型同时存储日期和时间信息,格式为YYYY-MM-DD HH:MM:SS,取值范围是1000-01-01 00:00:00到9999-12-31 23:59:59,占用8个字节的存储空间。它不依赖时区设置,存储的是输入时的具体日期时间值。
适合需要同时记录日期和时间的场景,且不需要时区转换,比如业务操作的具体发生时间、日志记录的时间戳等。
TIMESTAMP类型
TIMESTAMP类型同样存储日期和时间,格式和DATETIME一致,但取值范围更小,是1970-01-01 00:00:00 UTC到2038-01-19 03:14:07 UTC,占用4个字节。它会受时区影响,存储时会被转换为UTC时间,查询时再转换回当前会话的时区。
适合需要跨时区展示时间的场景,比如国际化系统的操作记录时间,同时它支持自动初始化和自动更新,常被用来作为记录的创建时间和更新时间。
YEAR类型
YEAR类型仅存储年份信息,格式为YYYY,取值范围是1901到2155,以及0000,占用1个字节的存储空间。它可以用2位或者4位数字格式输入,2位输入时00-69会被转换为2000-2069,70-99会被转换为1970-1999。
适用场景比如记录产品的生产年份、学生的入学年份等只需要年份信息的场景。
不同类型对比
为了更清晰地对比各类型的差异,整理如下表格:
| 数据类型 | 存储格式 | 取值范围 | 存储空间 | 是否受时区影响 |
|---|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 3字节 | 否 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3字节 | 否 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8字节 | 否 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 UTC ~ 2038-01-19 03:14:07 UTC | 4字节 | 是 |
| YEAR | YYYY | 1901 ~ 2155, 0000 | 1字节 | 否 |
使用示例
下面通过一个简单的表创建示例展示各类日期类型的使用:
-- 创建测试表,包含各类日期类型字段
CREATE TABLE test_date_type (
id INT PRIMARY KEY AUTO_INCREMENT,
user_birth DATE COMMENT '用户出生日期,使用DATE类型',
course_duration TIME COMMENT '课程时长,使用TIME类型',
order_time DATETIME COMMENT '订单创建时间,使用DATETIME类型',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间,使用TIMESTAMP自动初始化',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间,使用TIMESTAMP自动更新',
product_year YEAR COMMENT '产品生产年份,使用YEAR类型'
);
-- 插入测试数据
INSERT INTO test_date_type (user_birth, course_duration, order_time, product_year)
VALUES ('1995-08-15', '02:30:00', '2024-05-20 14:30:00', 2023);
选型建议
- 只需要日期信息优先选择DATE类型,存储占用小且语义明确
- 只需要时间信息优先选择TIME类型
- 需要同时记录日期时间且不需要时区转换,选择DATETIME类型
- 需要跨时区展示时间,或者需要自动记录创建、更新时间,选择TIMESTAMP类型,注意它的取值范围限制
- 只需要年份信息选择YEAR类型,避免存储冗余信息