You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0.37插入的DATETIME值查询结果不符问题求助

问题描述

我正在使用MySQL 8.0.37版本,创建了包含DATETIME类型字段的payments表用于存储UTC时间,表结构如下:

mysql> desc payments;
+-------------------------+---------------+------+-----+---------+-------+
| Field                   | Type          | Null | Key | Default | Extra |
+-------------------------+---------------+------+-----+---------+-------+
| id                      | varchar(21)   | NO   | PRI | NULL    |       |
| received_at             | datetime      | YES  |     | NULL    |       |
+-------------------------+---------------+------+-----+---------+-------+

将本地时间转换为UTC时间后执行插入操作:

insert into `payments` (`id`, `received_at`) values
('GX1CzNsgBr2aJcQNqn_eC', '2024-04-30 16:00:00.000'),
('7tlZag3tOQyBAX6ncygnn', '2024-05-01 15:59:59.999');

查询时发现第一条记录的received_at值显示正确,但第二条记录的查询结果为2024-05-01 16:00:00,而非插入的2024-05-01 15:59:59.999:

mysql> select id, received_at from payments order by received_at;
+-----------------------+---------------------+
| id                    | received_at         |
+-----------------------+---------------------+
| GX1CzNsgBr2aJcQNqn_eC | 2024-04-30 16:00:00 |
| 7tlZag3tOQyBAX6ncygnn | 2024-05-01 16:00:00 |
+-----------------------+---------------------+
2 rows in set (0.00 sec)

请问该异常的原因是什么?我忽略了哪些细节?

问题原因与细节分析
  • MySQL DATETIME的默认精度限制:MySQL 8.0中未指定精度的DATETIME类型默认只保留秒级精度,不会存储毫秒/微秒部分。当插入带毫秒的时间值时,MySQL会对毫秒部分进行四舍五入处理。你插入的2024-05-01 15:59:59.999,毫秒部分接近1秒,因此被四舍五入为2024-05-01 16:00:00;而第一条记录的毫秒为.000,四舍五入后无变化,所以显示正常。
  • 忽略了DATETIME的精度声明:如果需要存储毫秒甚至微秒级的时间,必须在定义字段时显式指定精度。比如用DATETIME(3)保留3位毫秒,DATETIME(6)保留6位微秒。修改表结构的语句如下:
ALTER TABLE payments MODIFY COLUMN received_at DATETIME(3) NULL;
  • 查询显示格式的细节:即使表字段支持毫秒存储,默认查询输出也不会显示毫秒部分,需要用DATE_FORMAT函数指定格式才能查看完整时间:
SELECT id, DATE_FORMAT(received_at, '%Y-%m-%d %H:%i:%s.%f') AS received_at FROM payments;

内容的提问来源于stack exchange,提问作者user3357926

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:33:29