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

 更新时间:2026年02月12日 08:51:04   作者: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)

  • MySQL 不会做任何时区转换
  • 存什么就是什么
  • 不同国家查询结果完全一致

示例

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

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

2025-12-16 14:30:00

适合场景

  • 预约时间(“当地 9 点开会”)
  • 促销、业务规则时间
  • 和地理位置强绑定的时间

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

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

TIMESTAMP

核心语义

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

  • 底层统一存 UTC
  • 写入时:本地时区 → UTC
  • 查询时:UTC → 当前 session 时区
  • 同一条记录在不同时区显示不同时间

示例

-- 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

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

五、三者如何选择?

推荐原则

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

  • 同一个瞬间 → TIMESTAMP
  • 同一个显示时间 → DATETIME
  • 只关心日期 → DATE

六、跨国系统的推荐做法

在跨国 / 多时区系统中:

  • 事件时间(创建、支付、日志)
    👉 使用 TIMESTAMP
  • 业务规则时间(预约、促销)
    👉 使用 DATETIME
  • 纯日期字段
    👉 使用 DATE

常见设计示例

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

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

七、总结

  • DATE:表示“哪一天”
  • DATETIME:表示“本地时间,不变”
  • TIMESTAMP:表示“绝对时间,会随时区变化”

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

相关文章

  • mysql中取系统当前时间,当前日期方便查询判定的代码

    mysql中取系统当前时间,当前日期方便查询判定的代码

    今天在写一段查询语句的时候,需要判定结束日期是不是大于当前日期,一般情况下都是通过php判定日期,然后查询。
    2011-12-12
  • mariadb集群搭建---Galera Cluster+ProxySQL教程

    mariadb集群搭建---Galera Cluster+ProxySQL教程

    这篇文章主要介绍了mariadb集群搭建---Galera Cluster+ProxySQL教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MySQL 索引和数据表该如何维护

    MySQL 索引和数据表该如何维护

    使用合适的数据类型完成数据表创建和建立索引后,工作并没有完结——你需要去维护数据表和索引以保证它们运行良好。数据表维护的主要目的是查找和修复冲突,维护精确的索引统计和减少碎片。
    2021-05-05
  • MySQL常用聚合函数详解

    MySQL常用聚合函数详解

    下面小编就为大家带来一篇MySQL常用聚合函数详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • MySQL数据库卸载以及删除所有有关信息详细步骤

    MySQL数据库卸载以及删除所有有关信息详细步骤

    在MySQL中数据删除操作不仅仅是简单地将某一个或多个行删除,下面这篇文章主要给大家介绍了关于MySQL数据库卸载以及删除所有有关信息的详细步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 深入mysql慢查询设置的详解

    深入mysql慢查询设置的详解

    本篇文章是对mysql慢查询设置进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL新增字段后Java实体未更新的潜在问题与解决方案

    MySQL新增字段后Java实体未更新的潜在问题与解决方案

    在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与 Java 对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可能忘记同步更新Java实体类,会导致什么问题?接下小编给大家介绍了MySQL新增字段后Java实体未更新的潜在问题与解决方案
    2025-03-03
  • 几道MySQL的精选大厂面试题及回答(被提问的几率很高!)

    几道MySQL的精选大厂面试题及回答(被提问的几率很高!)

    金三银四是面试求职高峰期,最近有很多网友都在求大厂面试题,发出来分享给大家,这篇文章主要介绍了几道MySQL的精选大厂面试题及回答,这些题被提问的几率很高,需要的朋友可以参考下
    2026-04-04
  • 图文详解mysql5.7安装教程

    图文详解mysql5.7安装教程

    这篇文章主要以图文结合的方式为大家详细介绍了mysql5.7安装教程的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL中data_sub()函数定义和用法

    MySQL中data_sub()函数定义和用法

    使用 date_sub() 函数,从 answer_date 减去相应的天数,这个天数是由上面计算的行号决定,也就是减去行号,从而来生成一个新的日期,这篇文章主要介绍了MySQL中data_sub()函数,需要的朋友可以参考下
    2024-02-02

最新评论