Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL  DATE DATETIM TIMESTAMP

MySQL 中 DATE / DATETIME / TIMESTAMP 的区别小结

作者:Knight_AL

在 MySQL 中,DATE、DATETIME、TIMESTAMP 都用来表示时间,但语义、存储方式以及对时区的处理完全不同,本文就来详细的介绍一下这三种的用法,感兴趣的可以了解一下

在 MySQL 中,DATE、DATETIME、TIMESTAMP 都用来表示时间,但语义、存储方式以及对时区的处理完全不同。如果不理解这些差异,很容易在系统国际化或统计分析时踩坑。

一、核心区别一览表

类型是否包含时间是否涉及时区存储大小典型用途
DATE❌ 仅日期❌ 否3 bytes生日、账期、自然日
DATETIME✅ 日期+时间❌ 否8 bytes业务时间、规则时间
TIMESTAMP✅ 日期+时间✅ 是4 bytes事件发生时间、日志

二、DATE:只表示“哪一天”

DATE
-- 示例:2025-12-16

特点

适合场景

👉 DATE 不表示时间点,因此不涉及跨时区问题。

三、DATETIME:不关心时区的“本地时间”

DATETIME
-- 示例:2025-12-16 14:30:00

核心语义

墙上时间(Wall Clock Time)

示例

INSERT INTO t VALUES ('2025-12-16 14:30:00');

无论在中国还是美国查询,结果都是:

2025-12-16 14:30:00

适合场景

⚠️ 不适合表示“事件发生的真实时间”

四、TIMESTAMP:表示“绝对时间点”

TIMESTAMP

核心语义

全球唯一的时间瞬间(UTC)

示例

-- session time_zone = '+08:00'
INSERT INTO t VALUES (NOW());

数据库存储的是:                       

2025-12-16 06:30:00 (UTC)

-- session time_zone = '-05:00'
SELECT time FROM t;

查询结果为:

2025-12-16 01:30:00

👉 显示不同,但指向同一个瞬间。

五、三者如何选择?

推荐原则

先想清楚:你要表达的是“同一个瞬间”,还是“同一个显示时间”?

六、跨国系统的推荐做法

在跨国 / 多时区系统中:

常见设计示例

created_at   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
biz_time     DATETIME  NOT NULL
biz_timezone VARCHAR(32)

这样既能保证技术上的时间统一,又不丢失业务语义

七、总结

到此这篇关于MySQL 中 DATE / DATETIME / TIMESTAMP 的区别小结的文章就介绍到这了,更多相关MySQL DATE DATETIM TIMESTAMP内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文