研发反馈问题,数据库中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类型详解的更多相关文章

  1. (转)MySQL字段类型详解

    MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...

  2. mysql float类型详解

    mysql float类型详解float类型长度必须设置3以上 不然会报错 out of range如果设置3 就只是 整数+小数的长度 比方说3.23 3.2等等 3.333就不行了 4位了

  3. 别在细节上栽跟头------------mysql 字段类型详解

    也许你平时不在意,在设计数据库的时候,数字就设成int(10) 字符串就设成varchar(20)或者text 普通情况下是没有问题的,但是若不理解字段类型和长度的含义,总有一天你会在这里栽跟头, 这 ...

  4. 转 MySQL 日期类型详解

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较.  日期类型        存储空间       日期格式                 日期范围  ------------ ---- ...

  5. MySQL字段类型详解

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

  6. MySQL 字段类型详解

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

  7. mysql string types ---- mysql 字符类型详解

    一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...

  8. mysql numberic types ---- mysql 数值类型详解

    编程语言中大多都有数据类型一说.虽然mysql 的sql 语句与标准sql 有别.但是宏观上看还是差不多的:下面我们说一下mysql数据库中的数值类型 一.在mysql里有那些类型可以表示数值: 1. ...

  9. Sqlite Datetime类型详解

    日期和时间函数 date(timestring, modifier, modifier, ...) time(timestring, modifier, modifier, ...) datetime ...

随机推荐

  1. Flutter Widgets 之 ListWheelScrollView

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 在展示大量数据的时候我们第一会想到使用ListV ...

  2. PHP数组知识点整理

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. C#可空类型知多少

    在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析. 1.可空类型基础知识 顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullab ...

  4. 前端基础知识之HTML

    [1: What does a doctype do?] 1: doctype是html文件的第一行代码,意味着它的前面有注释都不行.所以要要写在<html>标签前面,而且它不属于html ...

  5. VGG16等keras预训练权重文件的下载及本地存放

    VGG16等keras预训练权重文件的下载: https://github.com/fchollet/deep-learning-models/releases/ .h5文件本地存放目录: Linux ...

  6. Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...

  7. hadoop HDFS完全分布式搭建

    1.准备阶段 准备好两台虚拟机(安装好hadoop,见:https://www.cnblogs.com/cjq10029/p/12336446.html),计划: IP 主机名 192.168.3.7 ...

  8. 2019年高校微信小程序开发大赛学习笔记

    学做小程序(学堂在线笔记)一.传统布局 text-align:center //水平居中 margin-bottom: 60px //设置间距 二.弹性盒子布局 display:flex; flex- ...

  9. Redis系列三 - 缓存雪崩、击穿、穿透

    前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...

  10. 2020ubuntu1804server编译安装redis笔记(一)及报make test错误解决办法

    redis的大名我想大家都不陌生,今天在ubuntu server上进行编译安装,虽然apt也可以安装,但作为内存数据库,redis又是c开发的,编译安装,对机器的适应和性能更好. 安装笔记如下 第1 ...