研发反馈问题,数据库中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:56 |

+------+---------------------+

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/63');

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 datetime类型详解相关推荐

  1. mysql字段类型详解_MySQL字段类型详解

    MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段 ...

  2. java string类型详解_Java字符串类型详解

    Java 字符串类主要有String.StringBuffer.StringBuilder.StringTokenizer 1.字符串类型底层都是使用char数组进行实现. 2.从jdk1.7以后,S ...

  3. java float 详解_Java基本类型详解

    在现实生活中,我们能够接触的到信息有很多种,有文字的,有数字的,有图片的,有声音的,还是视频的,这些信息我们随处可见,可以说我们离不开这些信息.现代的人们离不开计算机,计算机能够帮我们处理很多信息,不 ...

  4. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)

    Mysql的数据类型主要分为三类:数字类型.字符串(字符)类型.日期和时间类型,由于时间紧迫,根据学习的需要 数字类型暂不做详解,等待有时间了在修改此文档,此文主要介绍mysql 数据类型中的字符串类 ...

  5. MySQL字段类型详解

    MySQL字段类型详解 2009-01-05 09:25 来源:泡菜博客 0个评论 分享文章 A- A+ 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 MySQL支持 ...

  6. mysql中数据库字段类型详解

    mysql中数据库字段类型详解 1,blob字段 mysql中blob是一个二进制大型对象,是一个可以储存大量数据的容器,它能容纳不同大小的数据. mysql中blob的四种类型除了存储数据的大小有区 ...

  7. mysql数据库字段类型大全_mysql数据库字段类型详解

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  8. 详解mysql字段类型int(4) int(10)等区别

    一.mysql字段类型大致可以分为:数值.日期/时间.字符串 数值类型:tinyint,smallint,mediumint,int/integer,bigint,float,double,decim ...

  9. MySQL中tinytext、text、mediumtext和longtext等各个类型详解

    一.字符串类型 类型 范围 说明   Char(N) [ binary] N=1~255 个字节 binary :分辨大小写 固定长度 std_name cahr(32) not null VarCh ...

  10. mysql binlog event_MySQL binlog中的事件类型详解

    MySQL binlog记录的所有操作实际上都有对应的事件类型的,譬如STATEMENT格式中的DML操作对应的是QUERY_EVENT类型,ROW格式下的DML操作对应的是ROWS_EVENT类型. ...

最新文章

  1. 2019秋招面试常考题目
  2. Zabbix监控httpd服务
  3. 路由到另外一个页面_一个简单的Vue按钮级权限方案
  4. 漫画:什么是SHA系列算法
  5. 201521123035《Java程序设计》第八周学习总结
  6. unity多人游戏_如何使用Unity 2D和镜像构建多人纸牌游戏(更新)
  7. java中none applicable_Java线程使用技巧学习(二)
  8. python列表和字典_2020/11/18 python学习第5课 列表和字典
  9. 分享一款影视源码_爱客影院网站3.5.6版本
  10. Waves13混音效果全套插件
  11. php 万能密码,万能密码漏洞利用
  12. 用纯Python就能写一个漂亮的网页
  13. Jieba分词并去停用词
  14. 高富帅的颜色插值方法:在视觉感知线性变化的色彩空间中进行颜色插值
  15. .Net Framework 4安装失败,提示RGB9RAST_x86.msi或者Windows6.0-KB956250-v6001-x86.msu
  16. Lake Shore低温温度传感器—DT-670 硅二极管
  17. 【读书笔记】——奇点临近
  18. 双向数据绑定原理(三种实现方式)
  19. python设置折线图标题字体为宋体_python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)...
  20. ALEVEL经济学:通货膨胀的原因是什么?

热门文章

  1. 一、Crowd的安装
  2. 没有无线网卡的服务器开wifi,电脑没无线网卡怎么开wifi热点 160wifi一键上网方法流程...
  3. bzoj 4819 [Sdoi2017]新生舞会
  4. java名片合成_HTML5 canvas绘图基础(电子名片生成器源码)
  5. 【无标题】鸿蒙培训1
  6. Python+Django基于python摄影展示个人相册系统#毕业设计(源码+系统+mysql数据库+Lw文档)
  7. matlab加速度转化为位移,matlab数值积分实现加速度、速度、位移的转换(时域频域积分)...
  8. HD1201 18岁生日
  9. Face Recognition,不只是人脸识别
  10. [Gitlab CI/CD] fatal: could not read Username for ‘xxx‘: No such device or address