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
相关产品推荐
相关产品推荐

