1. 存储范围与格式
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:同样存储日期+时间,但范围较小,仅 1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC,受 Unix 时间戳限制。
2. 时区处理
DATETIME:存储的是绝对时间,写入和读取不做时区转换。
TIMESTAMP:存储时会转换为 UTC,读取时再转换为当前时区,适合跨时区系统,避免显示混乱。
3. 存储空间与特性
DATETIME:占 8 字节,无自动更新时间特性。
TIMESTAMP:占 4 字节,支持 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 自动记录修改时间,节省空间但有 2038 年问题。
4. 典型应用场景
DATE:生日、节假日等仅需日期的字段。
DATETIME:需要跨时区保持一致的绝对时间,如注册时间、历史记录。
TIMESTAMP:需要本地化显示时间、自动更新时间或节省存储空间的高频记录,如日志、订单修改时间。
示例:
— 记录绝对时间(不随时区变化)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
register_time DATETIME DEFAULT NOW()
);
— 记录本地化时间并自动更新时间
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
选择建议: 若需跨时区一致性或超长时间范围,用 DATETIME;若需时区转换、自动更新时间或节省空间,用 TIMESTAMP。