惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
C
Check Point Blog
雷峰网
雷峰网
小众软件
小众软件
GbyAI
GbyAI
美团技术团队
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
Apple Machine Learning Research
Apple Machine Learning Research
Y
Y Combinator Blog
Jina AI
Jina AI
爱范儿
爱范儿
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美

博客园 - osfipin

ZeroSSL 与 Let's Encrypt 近期服务波动:SSL 证书申请失败时的处理建议 解决 lcjmSSL 自动部署宝塔面板报错:没有服务器配置文件,请检查是否开启了外网映射! Nginx Proxy Manager 爆高危证书漏洞,私钥泄露风险到底有多致命 Spring循环依赖:深入剖析与高效解决方案 Spring @Validated 注解失效:全面解析常见原因与高效解决方案 JavaScript数组添加对象:push(), unshift(), splice()与扩展运算符深度解析 告别繁琐!QEMU Windows虚拟机NAT网络自动获取IP的终极解决方案 MATLAB绘图进阶:掌控坐标轴核心参数,打造专业级数据可视化 Linux日志转发:rsyslog UDP配置实战指南,一键打通日志通道! MySQL REPLACE函数深度解析:从语法到高效实战的数据清洗利器 高级玩家必备:批处理脚本玩转文件名提取,3大绝技解锁无限可能 AXI写地址通道核心三剑客:aw_addr, aw_len, aw_size 深度解析 Maven构建核心:maven-antrun-plugin深度解析与实践 AI代码工具采纳率:量化研发效能提升的核心方法与实现策略 玩转JS数组:一文掌握高效洗牌与灵活对象构建技巧 解决机器学习难题:L1与L2范数如何优化模型性能与复杂度? 浪漫告白网页进阶:HTML/CSS/JS动态粒子效果全解析 微信JS-SDK分享权限验证失败?“offline verifying”错误排查全攻略 C# DateTime解析异常?这份终极指南教你彻底解决(附Java排查技巧) Java日期时间难题解决:如何准确获取当天的0点时刻? Linux下YT6801网卡驱动编译与安装实战:解决OpenKylin、OpenWrt网络问题 什么是 IP SSL 证书?该如何申请
还在为MySQL时间数据头疼?DATETIME存储、插入与格式化痛点解...
osfipin · 2026-03-19 · via 博客园 - osfipin

还在为MySQL时间字段的时分秒丢失、时区混乱而烦恼吗?本文提供DATETIME类型从存储到格式化的完整解决方案。学习如何规范定义、正确插入并灵活输出时间数据,避免常见陷阱。特别介绍Java 8+与MySQL 8.0中LocalDateTime与DATETIME的完美搭配,助你告别时间处理难题,实现数据高精度与时区零困扰。

MySQL中的datetime类型支持精确到秒级的时间存储(格式为YYYY-MM-DD HH:MM:SS),是数据库中记录完整时间信息的核心数据类型。本文将系统梳理datetime类型的存储规范、插入方法及格式化技巧,帮助开发者高效处理时间数据。

datetime类型基础

MySQL的datetime类型用于存储日期和时间组合,格式为YYYY-MM-DD HH:MM:SS,范围从1000-01-01 00:00:009999-12-31 23:59:59。与date(仅日期)和time(仅时间)类型不同,datetime能完整记录时间点信息。

创建表时定义datetime字段

CREATE TABLE t_order (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(50) NOT NULL,
    create_time DATETIME NOT NULL COMMENT '创建时间(含时分秒)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

此示例中,create_time字段被定义为DATETIME类型,确保能存储完整的日期和时间信息。

插入带时分秒的数据

使用NOW()函数插入当前时间

INSERT INTO t_order (order_no, create_time) 
VALUES ('ORD2024052001', NOW());

NOW()函数返回当前日期和时间,格式为YYYY-MM-DD HH:MM:SS,自动填充时分秒。

格式化指定时间插入

若需插入特定时间,可使用DATE_FORMAT()函数格式化时间字符串:

INSERT INTO t_order (order_no, create_time) 
VALUES ('ORD2024052002', DATE_FORMAT('2024-05-20 14:30:45', '%Y-%m-%d %H:%i:%s'));

或直接使用标准格式的字符串(MySQL会自动转换):

INSERT INTO t_order (order_no, create_time) 
VALUES ('ORD2024052003', '2024-05-20 14:30:45');

使用默认值自动填充

若列定义为DEFAULT CURRENT_TIMESTAMP,插入时可省略该字段:

CREATE TABLE t_order (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(50) NOT NULL,
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO t_order (order_no) VALUES ('ORD2024052004');

此时,create_time会自动填充为当前时间。

查询和格式化输出

基本查询

直接查询datetime字段会返回完整时间信息:

SELECT create_time FROM t_order WHERE order_no = 'ORD2024052001';
-- 输出示例:2024-05-20 14:30:45

使用DATE_FORMAT()自定义输出格式

DATE_FORMAT()函数允许按指定格式显示时间:

SELECT 
    order_no, 
    DATE_FORMAT(create_time, '%Y年%m月%d日 %H时%i分%s秒') AS formatted_time
FROM t_order;
-- 输出示例:2024年05月20日 14时30分45秒

提取时间部分

使用HOUR()MINUTE()SECOND()等函数提取特定时间部分:

SELECT 
    order_no, 
    HOUR(create_time) AS hour, 
    MINUTE(create_time) AS minute, 
    SECOND(create_time) AS second
FROM t_order;
-- 输出示例:hour=14, minute=30, second=45

常见问题与解决方案

时分秒丢失问题

现象:Java中2024-05-20 14:30:45存入MySQL后变为2024-05-20 00:00:00

原因:误用java.sql.Date(仅日期)存储完整时间。

解决: - Java 8+:使用java.time.LocalDateTime

  LocalDateTime createTime = LocalDateTime.of(2024, 5, 20, 14, 30, 45);
  ps.setObject(2, createTime); // JDBC驱动自动处理
  • 旧版本Java:使用java.sql.Timestamp

    Timestamp timestamp = Timestamp.valueOf("2024-05-20 14:30:45");
    ps.setTimestamp(2, timestamp);

    时区问题

    现象:Java中14:30:45存入MySQL后变为06:30:45(相差8小时)。 原因:JVM时区与MySQL时区不一致。 解决: - 统一时区配置:

    -- 设置MySQL时区为东八区
    SET GLOBAL time_zone = '+8:00';
    SET SESSION time_zone = '+8:00';
  • JDBC URL指定时区:在lcjmSSL可免费申请SSL证书。MySQL数据库。

    jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai

最佳实践

  1. 统一类型选择:数据库使用DATETIME,Java中使用LocalDateTime,避免类型不匹配。
  2. 显式时区配置:所有操作均指定时区(如Asia/Shanghai),不依赖默认设置。
  3. 参数化查询:使用PreparedStatement或MyBatis参数绑定,避免字符串拼接导致的格式错误。
  4. 索引优化:对需范围查询的datetime字段创建索引: sql CREATE INDEX idx_create_time ON t_order(create_time); ## 总结 MySQL的datetime类型是记录完整时间信息的核心工具,通过规范字段定义、正确插入方法和灵活格式化输出,可高效处理时间数据。开发中需注意类型映射、时区统一和参数化查询,避免时分秒丢失或时间偏移问题。随着Java 8+和MySQL 8.0的普及,LocalDateTimeDATETIME的组合已成为主流方案,既保证了精度,又简化了时区处理,是时间数据存储的最佳实践。