Mysql 插入时间(Date)变大的问题(精度)

博客指出两个SQL语句主要区别在于时间。MySQL表设计为Date类型时,参数小于2021 - 06 - 06 23:59:59.4存为2021 - 06 - 06,大于等于2021 - 06 - 06 23:59:59.5存为2021 - 06 - 07,表明其C底层实现有四舍五入精度处理,提醒处理时间插入时要注意。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

insert into ic_xx ( data_type, dept_id, mail_count, mail_amount, scan_amount, scan_rate_lp, year, week, begin_date, end_date, user_id ) values ( 2, 113, 1054, 2.61, 2.58, 0.90570593962999, 2021, 23, '2021-05-31 00:00:00.0', '2021-06-06 23:59:59.4', 1 );
insert into ic_xx ( data_type, dept_id, mail_count, mail_amount, scan_amount, scan_rate_lp, year, week, begin_date, end_date, user_id ) values ( 2, 113, 1054, 2.61, 2.58, 0.90570593962999, 2021, 23, '2021-05-31 00:00:00.0', '2021-06-06 23:59:59.5', 1 );

两个sql语句主要区别就是时间。在mysql的表设计为Date类型,

如果参数是或小于2021-06-06 23:59:59.4 (2021-06-06 23:59:59.499 ) 则数据库存的值2021-06-06

如果参数是或大于2021-06-06 23:59:59.5 (或2021-06-06 23:59:59.500 ) 则数据库存的值为2021-06-07。

显然,mysql的C底层实现过程进行四舍五入的精度处理。

因此,在处理时间插入时,特别用hutool工具取得的极限时间值时,在插入时需特别注意,容易翻车。

### 设置 MySQL 中日期字段的默认值为当前时间MySQL 数据库中,默认情况下,`DATE` 类型不支持 `CURRENT_TIMESTAMP` 作为其默认值。这是因为 `CURRENT_TIMESTAMP` 是专门为 `DATETIME` 和 `TIMESTAMP` 类型设计的功能[^3]。 如果希望实现类似于 `CURRENT_TIMESTAMP` 的功能用于 `DATE` 列,则可以通过以下方式间接完成: #### 方法一:使用触发器 可以创建一个触发器,在插入数据时自动填充当前日期到目标列。 ```sql CREATE TRIGGER before_insert_table_name BEFORE INSERT ON table_name FOR EACH ROW SET NEW.date_column = CURDATE(); ``` 此方法利用了 `CURDATE()` 函数来获取当前日期并将其赋值给指定的 `DATE` 列[^1]。 #### 方法二:升级至更高版本的 MySQL 并更改数据类型MySQL 5.6 开始,`DATETIME` 支持 `DEFAULT CURRENT_TIMESTAMP` 功能。因此,可以选择将 `DATE` 列更改为 `DATETIME` 或者 `TIMESTAMP` 类型,并应用如下定义: ```sql ALTER TABLE table_name MODIFY COLUMN date_column DATETIME DEFAULT CURRENT_TIMESTAMP; ``` 需要注意的是,虽然这种方法简单有效,但它改变了原始表结构中的数据精度(即增加了时间部分)。这可能会影响现有应用程序逻辑或者存储空间需求[^2]。 #### 方法三:手动处理业务逻辑 另一种解决方案是在应用程序层面负责设置该字段值而不是依赖数据库层面上的操作。每次向数据库提交新记录之前都先设定好相应的日期值。 以上三种方案各有优劣,请根据实际项目情况选择最适合的一种实施。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值