面试题:能谈谈Date、Datetime、Time、Timestamp、year的区别吗?
一、 推荐阅读
首发地址:https://mp.weixin.qq.com/s/9zKX86P4kzlKla6-NyS3EA
使用推荐阅读,有更好的阅读体验
二、准备
如果面试官问你:了解 date、datetime、time、timestamp、year 有什么区别吗?
其实大概率就是看你曾经用过哪些,以及有没有留心对比它们的异同。如果你没有时间去做一下小实验,没关系!大概浏览一下我下面的小Case就OK了。
创建下面这张表,下面的 insert sql 都是往这个表中插入数据。
三、Year
支持范围:1901~2155 。
1901那年清政府签订了《辛丑条约》
在 MySQL5.7.5 中删除了对Year(2)的支持,同一转换为Year(4)。所以如果你使用这个版本的MySQL,会发现它会把年份以4位长度的数字展示给我们看。
你可以尝试插入一个超过它规定的上限2155的值 -- 2156 ,如下:
你会发现MySQL报错了,这是因为默认情况下MySQL开启了严格模式!
针对非法值的插入,MySQL是否报错取决于SQL是否开启了严格模式。
白日梦在上一篇“ 对NotNull字段插入Null值有什么现象” 中跟大家提及到了 什么是 sql mode,并且说了几个和日期相关的sql mode。不记得的同学可以去看一下。
比如通过下面的命令关闭严格模式。
然后插入非法值,结果很明显,不会报错。而且MySQL帮你插入了0值。
四、Date
支持的范围:1000-01-01 ~ 9999-12-31
下面做几个插入的小实验
看上面的例子,使用MySQL5.7默认的情况下是可以插入比1000-01-01更早的时间的!
那能不能插入0000-00-00呢?这取决于你使用的那种sql mode!
默认情况下是插入不进去的,如下:
插不进去的原因是:mysql5.7 默认的sql mode中开启了严格模式。
且开启使用了参数NO_ZERO_DATE
。
这个参数与严格模式一起起作用就会导致不能插入 0-0-0。
如果偏偏想插入 0-0-0 可以像下面这样将其去掉,然后重试。
五、Datetime
支持范围:1000-01-01 00:00:00.000000 to 9999-12-31 23:59:59.999999
很明显,Datetime比Date更精确。
不允许插入数字格式的日期。
六、Time
支持范围:-838:59:59.000000 to 838:59:59.000000
time类型不仅可以用来表示24h,还可以用来表示一个时间范围,这个时间范围可能会很大,甚至是负的。
下面做几个小实验
秒数是满60进1的。
所以我插入60时,在jdbc层面会爆出下面的错误:format exception
可以插入正常的时间
在看下面这个例子:
虽然mysql支持往time字中插入-838:59:59.000000
但是失败了。
原因如下图: IDE本身通过java的jdbc驱动连接MySQL。
jdbc尝试会将-838:59:59.000000
转换成Java的封装类,结果还转失败了。
在直接连接MySQL是不会出现上图这种情况的。
如果范围超过了 -838:59:59.000000 to 838:59:59.000000 这两个边界值 ,就插入这边界值。
接着再看几个典型的例子:
七、Timestamp
支持范围: 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC
因为32位能表示的最大值是2147483647。另外1年365天的总秒数是 31536000,2147483647/31536000 = 68.1,也就是说32位能表示的最长时间是68年,从1970年开始的话,加上68.1,实际最终到2038年01月19日03时14分07秒。
过了这个上线,所有32位操作系统时间都会变成10000000 00000000 00000000 00000000
这个问题在64位操作系统中已经不复存在
好,开始我们的实验!
先尝试插入几个零值,无一例外,全部报错失败。
再插入一些大点的值
你会不会诧异这样一个问题:
timestamp合法区间最小值不是1970-01-01 00:00:01吗?
那为什么在上面的例子中我尝试写入插入1970-01-01 00:00:01竟然会失败?
那是因为我机器上的MySQL使用的时区是CST:China Standard Time UT+8:00
以北京时间为准,我们是在东八区。所以最后是+8:00 , 而不是+0:00
所以如果我们在1970-0101-000001后顺延八个小时,就能插入成功!
补充:
列类型 | 显示格式 |
---|---|
TIMESTAMP(14) | YYYYMMDDHHMMSS |
TIMESTAMP(12) | YYMMDDHHMMSS |
TIMESTAMP(10) | YYMMDDHHMM |
TIMESTAMP(8) | YYYYMMDD |
TIMESTAMP(6) | YYMMDD |
TIMESTAMP(4) | YYMM |
TIMESTAMP(2) | YY |
八、默认值
在你创建表的时候,可以为你的时间列选定一个默认值。
九、关注
为大家带来MySQL面试专题!本文是第 4 篇、全文110篇!公众号首发!
以问答的方式,由浅入深的帮你应对各类MySQL面试题的狂轰滥炸!当然也不乏会分享一些高阶读写分离数据库中间件原理及落地的技术实现,为你揭开数据库中间件神秘的面纱!
面试官都关注了!你还在犹豫什么呢?
面试题:能谈谈Date、Datetime、Time、Timestamp、year的区别吗?的更多相关文章
- MySQL 中常见的时间类型有三种 DATE, DATETIME 和 TIMESTAMP
MySQL 中常见的时间类型有三种 DATE, DATETIME 和 TIMESTAMP,其中 DATE 类型用于表示日期,但是不会包含时间,格式为 YYYY-MM-DD,而 DATETIME 和 T ...
- mysql中 date datetime time timestamp 的区别
MySQL中关于时间的数据类型:它们分别是 date.datetime.time.timestamp.year date :"yyyy-mm-dd" 日期 1000-01 ...
- MySQL数据库中的Date,DateTime,int,TimeStamp和Time类型的对比
DATETIME 用在你需要同时包含日期和时间信息的值时.MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00 ...
- 转 数据库中的 date datetime timestamp的区别
转 数据库中的 date datetime timestamp的区别 DATETIME, DATE和TIMESTAMP类型是相关的.本文描述他们的特征,他们是如何类似的而又不同的. DATETIME类 ...
- Mysql 日期类型 date、datetime、timestamp.
三种: date.datetime.timestamp. date : 格式 "YYYY-MM-DD" ,范围 "1000-00-00"到"9999 ...
- MySQL-时间(time、date、datetime、timestamp和year)
情景进入 情境进入: 今天调试某查询页面,偶尔发现一个问题,刚刚插入的数据,没有正常排序显示,经过后台调试sql,发现一个问题??? 经过上面红色对比,不知道你发现问题没,Order by 只是多一个 ...
- MySQL 时间类型 DATE、DATETIME和TIMESTAMP
1.DATE.DATETIME和TIMESTAMP 表达的时间范围 Type Range Remark DATE '1000-01-01' to '9999-12-31' 只有日期部分,没有时间部分 ...
- time、date、datetime、timestamp和year
在此声明mysql数据库 时间上总共有五中表示方法:它们分别是 time.date.datetime.timestamp和year. time : “hh:mm:ss”格式表示的时间值,格式显示TIM ...
- Mysql 实战关于date,datetime,timestamp类型使用
最近在做一个项目 项目中 不同的小伙伴同时在不同的业务模块中用到了date,datetime,timestamp这三个类型 特别是datetime,timestamp这两个 如果不能理解到位 其实很 ...
- Mysql - date、datetime、timestamp 的区别
date.datetime 的区别 顾名思义,date 日期,datetime 日期时间,所以 date 是 datetime 的日期部分 MySQL 以 YYYY-MM-DD hh:mm:ss 格式 ...
随机推荐
- cobbler自动化安装centos
转载于:https://www.cnblogs.com/skymydaiji/p/10877533.html 一.cobbler介绍 1.前言 cobbler 是基于 python 语言开发的 pxe ...
- IDEA中,已经被加到版本库的文件如何在提交的时候忽略它们
因为某些资源共享的原因,我在本地调试的时候需要修改Java启动程序类上的一些配置,禁用掉Kafka等等.然后我就想 把这些本地调试需要修改的但是线上服务不需要修改的给忽略掉,于是加入到了.gitign ...
- bufferedReader 读取文件第一行第一个字符丢失问题
在做一个解析pacp文件的时候需要读取文件中的每个属性,但是每次读出来的内容的每一行的第一个字符都被吞掉了,找了半天不知道为什么,后来看到在读取的时候用的read()方法,而且返回值是int类型,在变 ...
- MeteoInfoLab脚本示例:Hamawari-8 netCDF data
示例数据:ftp://ftp.bom.gov.au/anon/sample/catalogue/Satellite/IDE00220.201507140300.nc 该数据的分辨率很高(22000*2 ...
- day36 Pyhton 网络编程03
一.内容回顾 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- 联赛%你测试10T2:漫无止境的八月
题意: 思路: 有几个特殊的性质: 在不考虑q里面的单点修改,我们先只判断一个序列是否Yes. 我们注意到每次操作都是对一个长度为k的区间进行区间加减1的操作,所以我们如果将序列里面的数按%k分组,把 ...
- 电子阅读器.vbs
CreateObject("SAPI.SpVoice").Speak"你要说的话!"
- C# 面试前的准备_基础知识点的回顾_05
1.谈谈ViewState 这个问题,回答的好,工资翻一级 基本上浮现在出来的是,它是什么, 具体谈论的东西我就不一一细说了,只能说根据自己的学识去探讨,千万不要背书,很容易露馅,露馅的话给人一种不懂 ...
- 实现LNMP架构
LNMP简介 WEB资源类型: 静态资源:服务器端和客户端看到的是一样的 动态资源:服务器端放的是程序,客户端看到的是结果,并不是程序本身 和页面的静或者动没有关系 WEB相关语言 HTML JAVA ...
- [斯坦福大学2014机器学习教程笔记]第六章-代价函数(Cost function)
在这节中主要讲的是如何更好地拟合逻辑回归模型的参数θ.具体来说,要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题. 我们有一个训练集,训练集中有m个训练样本:{ ...