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 查询过滤之WHERE 子句与运算符实战技巧

    MySQL 查询过滤之WHERE 子句与运算符实战技巧

    本文将系统讲解WHERE子句的用法及常用运算符(算术、比较)的规则与实战技巧,帮你掌握数据筛选的精髓,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • SQL实现LeetCode(185.系里前三高薪水)

    SQL实现LeetCode(185.系里前三高薪水)

    这篇文章主要介绍了SQL实现LeetCode(185.系里前三高薪水),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Mysql 获取表的comment 字段操作

    Mysql 获取表的comment 字段操作

    这篇文章主要介绍了Mysql 获取表的comment 字段操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • MySQL数据库远程连接开启方法

    MySQL数据库远程连接开启方法

    有时候需要远程连接mysql数据库,默认是不可以的,大家可以参考下面的方法,解决下。
    2010-08-08
  • MySql 5.7.21免安装版本win10下的配置方法

    MySql 5.7.21免安装版本win10下的配置方法

    这篇文章主要介绍了MySql 5.7.21免安装版本win10下的配置方法,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • MySQL定时全库备份数据库

    MySQL定时全库备份数据库

    数据备份真的很重要, 因为可能有一天数据会被莫名其妙的删掉了,本文主要介绍了MySQL定时备份数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • MySQL登录时出现 Access denied for user ‘root‘@‘xxx.xxx.xxx.xxx‘ (using password: YES) 的原因及解决办法

    MySQL登录时出现 Access denied for user ‘

    今天打开mysql的时候突然提示:Access denied for user 'root'@'localhost' (using password: YES) 在网上搜索了很多文章,本文就来做一下总结,介绍了几种场景的解决方法,感兴趣的可以了解一下
    2024-03-03
  • MySQL查看日志简单易懂保姆级教程

    MySQL查看日志简单易懂保姆级教程

    这篇文章主要给大家介绍了关于MySQL查看日志简单易懂保姆级教程的相关资料,在操作MySQL数据库的时候会留下每一个步骤的痕迹,那怎么查看呢?就可以用日志去查看,需要的朋友可以参考下
    2023-08-08
  • MySQL中的distinct与group by比较使用方法

    MySQL中的distinct与group by比较使用方法

    今天无意中听到有同事在讨论,distinct和group by有什么区别,下面这篇文章主要给大家介绍了关于MySQL去重中distinct和group by区别的相关资料,需要的朋友可以参考下
    2023-03-03
  • 详解Mysql并行复制的原理

    详解Mysql并行复制的原理

    本文主要介绍了详解Mysql并行复制的原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-10-10

最新评论