SqlServer 关于 datetime 的更新引发的思考
今天在测试更新 SqlServer 表的 datetime 字段时,突然发现并没有更新成功,同时也没有报错,感觉十分诧异,因此仔细排查了一下,终于发现是和字段本身的精度有关。
现象
假设我们现在有一张 SqlServer 表 basic_info,其表结构为:
字段名 类型 name varchar open_time datetime
现在其中有一条数据:
name open_time Jack 2014-05-25 11:11:01.260
现在我想把这条数据的 open_time 字段修改为 2014-05-25 11:11:01.262,执行语句:
update basic_info set open_time = '2014-05-25 11:11:01.262' where name = 'Jack';
结果是并没有更新为我想要的值:
name open_time Jack 2014-05-25 11:11:01.263
这个 263 是怎么出现的呢?
原因
这个问题我排查了很久,最终在关于 datetime 字段定义 的网站上,在关于字段描述的表中,有这么一行:
Accuracy Rounded to increments of .000, .003, or .007 seconds
意思就是说, datetime 这个字段的 精度 ,四舍五入后会变为 .000, .003, or .007 秒。
这样的话,也就能说这个字段的时间毫秒数的个位数,只会是 0、3、7,那么也就能解释上面的现象,为什么我想更新成 2,最终变成了 3。
解决方法
当你对于精度要求不高的话,比如只需要精确到秒级别,那么这个字段的使用完全是没有问题的。
但如果你一定需要精确到毫秒呢?那么可以使用 datetime2 类型,它的精度可以精确到 100 纳秒。
总结
对于服务端开发人员,数据库几乎是一个无法避免的中间件,虽然我们并非专业的 DBA,但多了解一些总是好事。
有兴趣的话可以访问我的博客或者关注我的公众号、头条号,说不定会有意外的惊喜。
https://death00.github.io/
公众号:健程之道
相关文章
- Linux服务器硬件信息查询与日常运维命令总结
- Linux服务器带宽跑不满?用ethtool调优网卡参数,性能提升30%
- 如何在 Rocky Linux 中查看网卡流量?跟着小编学习iftop安装和使用
- Linux查看网卡速率_linux查看网卡当前速率
- 五一我要看七天小说!免费开源的轻量化书库talebook搭建流程。
- 我是如何用这3个小工具,助力小姐姐提升100%开发效率的
- html5和css3的常用参考网_基于html5和css3的网页制作
- 超详细的网络抓包神器 tcpdump 使用指南
- Vue 技术栈(全家桶)_vue全栈项目教程
- 学习ES6- 入门Vue(大量源代码及笔记,带你起飞)