日期时间类型用于保存年、月、日、时、分、秒等信息。MySQL 提供了多种时间类型,不同类型适合不同粒度和不同语义的时间数据。
常见类型包括:
YEARDATETIMEDATETIMETIMESTAMP
YEAR 用于保存年份信息。
适合的场景:
- 出生年份
- 入学年份
- 毕业年份
示例:
CREATE TABLE student_profile (
id int NOT NULL AUTO_INCREMENT,
enroll_year year DEFAULT NULL,
PRIMARY KEY (id)
);如果字段只需要表达“年份”,使用 YEAR 会比字符串更清晰。
DATE 用于保存日期,不包含时分秒,格式通常为 YYYY-MM-DD。
适合的场景:
- 生日
- 活动日期
- 结算日期
示例:
CREATE TABLE holiday (
id int NOT NULL AUTO_INCREMENT,
holiday_date date NOT NULL,
PRIMARY KEY (id)
);TIME 用于保存时间值,可以表示一天中的某个时间点,也可以表示一个时间间隔。
适合的场景:
- 上班时间
- 持续时长
- 每日提醒时间
示例:
CREATE TABLE work_time (
id int NOT NULL AUTO_INCREMENT,
start_time time NOT NULL,
PRIMARY KEY (id)
);DATETIME 用于保存完整日期和时间,格式通常为 YYYY-MM-DD HH:MM:SS。
适合的场景:
- 创建时间
- 预约时间
- 发布时间
示例:
CREATE TABLE article (
id int NOT NULL AUTO_INCREMENT,
publish_time datetime NOT NULL,
PRIMARY KEY (id)
);DATETIME 更偏向“业务时间”,它保存的是一个具体时间值,本身不强调时区转换。
TIMESTAMP 同样可以保存日期和时间,但它更常用于记录系统时间,例如创建时间、更新时间。
示例:
CREATE TABLE user_log (
id int NOT NULL AUTO_INCREMENT,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);这个例子里:
created_at在插入时自动写入当前时间updated_at在更新记录时自动刷新
因此 TIMESTAMP 很适合审计字段。
可以这样理解:
DATETIME更适合业务层面的“真实时间点”TIMESTAMP更适合系统自动维护的时间字段
常见实践:
- 订单创建时间、日志时间:常用
TIMESTAMP - 活动开始时间、预约时间:常用
DATETIME
如果只需要年份,用 YEAR;只需要日期,用 DATE;只需要时间,用 TIME;需要完整日期时间,则常在 DATETIME 和 TIMESTAMP 之间选择。选型的关键不只是格式,还要考虑字段的业务语义。