MySQL datetime类型详解
研发反馈问题,数据库中datetime数据类型存储的值末尾会因四舍五入出现不一致数据,影响查询结果,比如:程序中自动获取带毫秒精度的日期'2019-03-05 01:53:55.63',存入数据库后变成'2019-03-05 01:53:56’。
抛出问题:
具体情况看例子:
mysql> create table t(id int,dt datetime);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t values(1,'2019-03-05 01:53:55.63');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+------+---------------------+
| id | dt |
+------+---------------------+
| 1 | 2019-03-05 01:53: |
+------+---------------------+
1 row in set (0.00 sec)
问题好理解,数据库自动对毫秒精度进行了四舍五入,取了个近似值。
解决问题:
问题也好解决:1.修改字段类型,给datetime加上精度,改成datetime(2),这样就把后面的毫秒精度存进数据库了,也不会出现查询时数值错误;2.如果毫秒精度实际意义不大,可以在程序中截断毫秒值,存入数据库的值直接精确到秒,这样数据库层面不需要修改。
mysql> create table t_m(id int,dt datetime(2));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_m values(1,'2019-03-05 01:53:55.63');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_m;
+------+------------------------+
| id | dt |
+------+------------------------+
| 1 | 2019-03-05 01:53:55.63 |
+------+------------------------+
1 row in set (0.00 sec)
个人赞成第二种方法,因为架构定好后,不建议随便修改底层数据库,尽量从代码层满足需求,除非迫不得已。
问题延伸:
顺便说一下datetime数据类型。
1.自动识别时间字符串
查看数据库默认日期类型格式:
mysql> show variables like 'datetime_format';
+-----------------+-------------------+
| Variable_name | Value |
+-----------------+-------------------+
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
1 row in set (0.00 sec)
默认格式是‘%Y-%m-%d %H:%i:%s’这样的,一般写入数据也是这种格式。
当写入其他时间字符串时,只有数据库能识别都会写入成功,且是想要的数据;如果识别不了的时间值,会显示成‘0000-00-00 00:00:00’。
mysql> insert into t values(3,'20191221010203');
mysql> select * from t;
+------+---------------------+
| id | dt |
+------+---------------------+
| 3 | 2019-12-21 01:02:03 |
+------+---------------------+
mysql> insert into t values(4,'2019/12/21/1/21/3');
mysql> select * from t;
+------+---------------------+
| id | dt |
+------+---------------------+
| 4 | 2019-12-21 01:21:03 |
+------+---------------------+
插入一个不存在的时间,会显示出‘0000-00-00 00:00:00’,比如63秒
mysql> insert into t values(4,'2019/12/21/1/21/');
mysql> select * from t;
+------+---------------------+
| id | dt |
+------+---------------------+
| 4 | 0000-00-00 00:00:00 |
+------+---------------------+
2.查询时智能的补全模式
经常接到研发反馈,查一天的数据,查不出来,比如查询‘2019-12-21’日期的全部数据,很多人在where条件中写where dt = '2019-12-21',妄图查出一天的数据。如果dt类型是date,会如常所愿;如果是datetime或其他类型,恐怕要大失所望了,因为MySQL会对datetime值自动补零。
例子:
表中有3条数据:
mysql> select * from t;
+------+---------------------+
| id | dt |
+------+---------------------+
| 3 | 2019-12-21 01:02:03 |
| 4 | 2019-12-21 01:21:03 |
| 4 | 0000-00-00 00:00:00 |
+------+---------------------+
查询‘2019-12-21’的数据:
mysql> select * from t where dt='2019-12-21';
Empty set (0.00 sec)
期望查到两条数据,实际啥都没查到,因为数据库自动根据类型补全了0,实际查询语句成了:select * from t where dt='2019-12-21 00:00:00';
对于datetime类型的值,想要查询一天的数据,可以通过范围查询:between and(between and是左右闭合区间,两边数值都能查到) 。
mysql> select * from t where dt between '2019-12-21 00:00:00' and '2019-12-21 23:59:59';
+------+---------------------+
| id | dt |
+------+---------------------+
| 3 | 2019-12-21 01:02:03 |
| 4 | 2019-12-21 01:21:03 |
+------+---------------------+
3.其他
其它一些东西,比如和timestamp比较之类的,网上比较多,自行搜索。
MySQL datetime类型详解的更多相关文章
- (转)MySQL字段类型详解
MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...
- mysql float类型详解
mysql float类型详解float类型长度必须设置3以上 不然会报错 out of range如果设置3 就只是 整数+小数的长度 比方说3.23 3.2等等 3.333就不行了 4位了
- 别在细节上栽跟头------------mysql 字段类型详解
也许你平时不在意,在设计数据库的时候,数字就设成int(10) 字符串就设成varchar(20)或者text 普通情况下是没有问题的,但是若不理解字段类型和长度的含义,总有一天你会在这里栽跟头, 这 ...
- 转 MySQL 日期类型详解
MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ ---- ...
- MySQL字段类型详解
MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...
- MySQL 字段类型详解
一.非数字类型 类型 范围 说明 Char(N) [ binary] N=1~255 个字元 binary :分辨大小写 固定长度 std_name cahr(32) not null VarCh ...
- mysql string types ---- mysql 字符类型详解
一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...
- mysql numberic types ---- mysql 数值类型详解
编程语言中大多都有数据类型一说.虽然mysql 的sql 语句与标准sql 有别.但是宏观上看还是差不多的:下面我们说一下mysql数据库中的数值类型 一.在mysql里有那些类型可以表示数值: 1. ...
- Sqlite Datetime类型详解
日期和时间函数 date(timestring, modifier, modifier, ...) time(timestring, modifier, modifier, ...) datetime ...
随机推荐
- Design Patterns 25
尽管将一个系统分割成许多对象通常可以增加其可服用性, 但是对象间相互连接的激增又会降低其可复用性了. 大量的连接使得一个对象不可能在没有改变其他对象的支持下工作, 系统表现为一个不可分割的整体, 所以 ...
- charles添加https支持
- [置顶]
Python 使用itchat 对微信好友数据进行简单分析
人生苦短,我用Python! Python 热度一直很高,我感觉这就是得益于拥有大量的包资源,极大的方便了开发人员的需求. 最近在一个微信公众号上看到一个调用微信 API 可以对微信好友进行简单数据分 ...
- Spring Cloud Feign 组成和配置
Feign的组成 接口 作用 默认值 Feign.Builder Feign的入口 Feign.Builder Client Feign底层用什么去请求 和Ribbon配合时:LoadBalancer ...
- SpringCloud Ribbon组成和负载均衡规则
Ribbon饥饿加载 默认情况下Ribbon是懒加载的.当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多. 解决方式:开启饥饿加载 ribbon: eager-load: enabled: ...
- Nginx之常用基本配置(三)
前面我们聊了下了Nginx作为WEB服务器对客户端请求相关配置,文件操作优化.Nginx访问控制.basic验证,.状态模块状态页.gzip压缩配置:回顾请参考https://www.cnblogs. ...
- 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)
目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...
- Layabox 预制体prefab使用
//腊鸭官方api不详细系列之ui预制体 // 创建预制体文件,随便拖一个场景中的预制体到 Assets的任意文件夹中,要规范的话则放在Prefab中 // 上一步操作完后就可以在文件夹中看到.pre ...
- koa进阶史(二)
之前想着放弃CAS的验证吧,但是又去请教了一个大牛,了解到sf公司的CAS验证校验的参数不是sessionId而是另外两个,后登陆sit环境偷了两个参数后,后台接口成功返回200.然后node层也就能 ...
- 本地Hadoop集群搭建
什么是Hadoop? Hadoop是一个开源的Apache项目,通常用来进行大数据处理. Hadoop集群的架构: master节点维护分布式文件系统的所有信息,并负责调度资源分配,在Hadoop集群 ...