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 ...
随机推荐
- Flutter Widgets 之 ListWheelScrollView
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 在展示大量数据的时候我们第一会想到使用ListV ...
- PHP数组知识点整理
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C#可空类型知多少
在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析. 1.可空类型基础知识 顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullab ...
- 前端基础知识之HTML
[1: What does a doctype do?] 1: doctype是html文件的第一行代码,意味着它的前面有注释都不行.所以要要写在<html>标签前面,而且它不属于html ...
- VGG16等keras预训练权重文件的下载及本地存放
VGG16等keras预训练权重文件的下载: https://github.com/fchollet/deep-learning-models/releases/ .h5文件本地存放目录: Linux ...
- Java避坑宝典《Java业务开发常见错误100例》上线了
写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...
- hadoop HDFS完全分布式搭建
1.准备阶段 准备好两台虚拟机(安装好hadoop,见:https://www.cnblogs.com/cjq10029/p/12336446.html),计划: IP 主机名 192.168.3.7 ...
- 2019年高校微信小程序开发大赛学习笔记
学做小程序(学堂在线笔记)一.传统布局 text-align:center //水平居中 margin-bottom: 60px //设置间距 二.弹性盒子布局 display:flex; flex- ...
- Redis系列三 - 缓存雪崩、击穿、穿透
前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...
- 2020ubuntu1804server编译安装redis笔记(一)及报make test错误解决办法
redis的大名我想大家都不陌生,今天在ubuntu server上进行编译安装,虽然apt也可以安装,但作为内存数据库,redis又是c开发的,编译安装,对机器的适应和性能更好. 安装笔记如下 第1 ...