MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么?

在MySQL中,DATETIMETIMESTAMP都是用于存储日期和时间的类型,但它们有一些关键的区别:

1. 存储方式和范围

  • DATETIME

    • 存储的日期和时间值是以“年-月-日 时:分:秒”的格式表示。
    • 存储格式DATETIME存储的是固定的日期和时间信息,不受时区的影响。
    • 范围DATETIME的值范围为 '1000-01-01 00:00:00''9999-12-31 23:59:59'
    • 存储大小:占用 8 字节的存储空间。
  • TIMESTAMP

    • 存储的日期和时间值也以“年-月-日 时:分:秒”的格式表示,但它是基于UTC(协调世界时)存储的,并会根据时区的设置进行自动转换。
    • 存储格式TIMESTAMP存储的是自1970年1月1日以来的秒数(UNIX时间戳),并且根据系统时区设置自动转换为相应的本地时间。
    • 范围TIMESTAMP的值范围为 '1970-01-01 00:00:01' UTC'2038-01-19 03:14:07' UTC
    • 存储大小:占用 4 字节的存储空间。

2. 时区的影响

  • DATETIME:不受时区影响,存储的值就是你插入的值,不进行时区转换。
  • TIMESTAMP:受时区影响,存储的是UTC时间,但在插入和查询时,MySQL会自动将其转换为当前时区的时间。

3. 自动更新

  • DATETIME:通常不会自动更新,除非通过触发器或其他逻辑进行更新。
    • TIMESTAMP:可以设置为自动更新,例如,在插入或更新时自动记录当前时间。通常用于记录“创建时间”和“更新时间”。

4. 应用场景

  • DATETIME:适用于需要存储固定的日期和时间值的场景,例如,事件的发生时间,不需要考虑时区转换的情况。
  • TIMESTAMP:适用于需要记录时间戳并自动处理时区转换的场景,例如,日志记录、记录最后更新时间等。

5. 实际例子

假设我们有一个数据库表events,用于存储不同事件的发生时间,我们在表中使用DATETIMETIMESTAMP字段来分别存储事件的发生时间。

CREATE TABLE events (
    event_id INT AUTO_INCREMENT PRIMARY KEY,
    event_name VARCHAR(100),
    event_datetime DATETIME,
    event_timestamp TIMESTAMP
);

插入数据

假设当前的系统时区是UTC+8(即北京时间)。

INSERT INTO events (event_name, event_datetime, event_timestamp)
VALUES 
('Event 1', '2024-12-15 12:00:00', NOW()), 
('Event 2', '2024-12-15 15:00:00', NOW());
  1. event_datetime:存储了一个固定的日期和时间'2024-12-15 12:00:00',不管系统的时区是什么,存储的值始终是这个时间。
  2. event_timestampNOW()返回当前的时间戳,并且会根据系统时区进行调整。如果我们在UTC+8时区执行插入操作,那么存储的event_timestamp值会是当前时间的UTC时间。

查询数据

假设我们现在查询这些数据:

SELECT event_id, event_name, event_datetime, event_timestamp FROM events;

结果

+----------+------------+---------------------+---------------------+
| event_id | event_name | event_datetime | event_timestamp |
+----------+------------+---------------------+---------------------+
| 1 | Event 1 | 2024-12-15 12:00:00 | 2024-12-15 04:00:00 |
| 2 | Event 2 | 2024-12-15 15:00:00 | 2024-12-15 07:00:00 |
+----------+------------+---------------------+---------------------+

  • event_datetime字段保存的就是你插入的固定时间'2024-12-15 12:00:00',不受时区影响。
  • event_timestamp字段存储的是UTC时间,即根据系统时区UTC+8调整后的时间,转换为2024-12-15 04:00:0012:00:00 - 8小时)。

总结

  • DATETIME:它存储的是你输入的实际时间,独立于时区,不会做任何转换。
  • TIMESTAMP:它存储的是UTC时间,并且在插入和查询时根据当前时区进行转换。在这个例子中,event_timestamp保存的时间会根据时区自动转换。
posted @   Eiffelzero  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-12-15 1945. 字符串转化后的各位数字之和
点击右上角即可分享
微信分享提示