mysql神功 2.3 数据类型的细分之日期和时间类型
一、日期类型

1、YEAR

当你选择了YEAR类型时,超出范围的录入会提示:哪个列,哪行出现问题。如图2-37
我们输入: '1901' 或 1901 保存后的结果都是 1901
但是我们输入 2156 时就会告诉我们,年份列第5行的值超过取值范围

正常人输入就是4位年,范围1901~2155就可以避免错误。但是有人耍小聪明,那就麻烦了。
特殊情况1:输入字符串
'0' ~ '69' 返回:2000~2069

'0' 、'00'、'000' 结果相同,返回 2000 但是 '0000' 返回 0000
注:0000不是年,公元中也没有0年。
'1'、'01'、'001'、'0001' 结果相同,返回 2001
......
'69'、'069'、'0069' 结果相同,返回 2069
'70' ~ '99' 返回:1970~1999

'70'、'070'、'0070' 结果相同,返回 1970
'71'、'071'、'0071' 结果相同,返回 1971
......
'99'、'099'、'0099' 结果相同,返回 1999
有些小伙伴会问,你这都是2位数,那输入3位数呢?
因为你输入3位数无法保存,所以凡是不让你做的事情,我就可以一带而过,
让你做又让你错的事情,我就要提醒你尽量避免。
就好比,你说你要暗杀塞罗奥特曼,我可能当你有病。但是把塞罗奥特曼换成张三,我就要劝你了。

特殊情况2:输入数字
输入数字 0 : 会返回 0000 同上,0000不是年,公元里面没有0年
输入数字 1~69 或 01~69 或 001~069 会返回:2001~2069
输入数字 70~99 或 070~099 会返回:1970~1999
以上,我废了这么多话,目的是什么呢?
答:输入时请使用1901~2155这样的标准四位数。
如果使用1901年以前或2155年以后的年份如何处理?
答:可以考虑使用整数型,因为年份可能会用于计算。这里优先推荐 SMALLINT类型,它占用2字节,范围 0~65535(无符号)或 -32768~32767(有符号)足够你用了。
2、DATE

在YEAR类型我建议大家输入1901~2155这样的标准年份格式
在DATE类型中,我仍然推荐大家输入标准年份格式,如图2-43
标准格式:四位年、两位月、两位日

有些书籍上介绍,可以按 'YYYY-MM-DD' 或 'YYYYMMDD' 或 'YY-MM-DD' 或 'YYMMDD'
但是我在Navicat for MySQL 12.0.29版中直接使用测试不通过,如下四幅图所示




声明,并不是人家书讲的不对,只是Navicat for MySQL 12.0.29不能直接使用而已。如下图,我输入密码进入MySQL服务器,使用“小哈”这个库,对测试表1添加我的生日:'2000-10-07' 是可以成功的。

当我们在Navicat for MySQL 12.0.29 使用代码插入行时也是OK的。
后面要讲的时间类型函数都是一样的情况,不再重复。

还有一种方法,就是年写成两位 YY-MM-DD 或 YYMMDD
这里要注意,YY和我们上面讲的YEAR函数一样,
00~69 是 2000~2069 ,70~99 是 1970~1999
所以再次提醒大家,按标准的方式输入 YYYY-MM-DD 或 YYYYMMDD 并且注意取值范围
如果涉及公元1000年1月1日以前的日期,建议使用文本字符串类型,下节课会讲。
二、时间类型

小数秒的空间是动态的,如果你不用,它就是0字节。1~2位小数秒占1字节,3~4位小数秒占2字节,5~6位小数秒占3字节。图2-44 中括号代表可选参数,输入时应该这样写,如图2-45。因为我工作中用不到,所以后面关于这个知识将不再介绍。

可能你会发现,你写完的小数秒,保存无效,那是因为你的表设计里的长度为0。可以将长度改成你需要的位置1~6,如图2-46

如果你是通过代码完成创建表,那这里你要注意TIME后面加小括号写上长度。
因为现在还没学代码,防止你们手里有人看书在这里蒙圈,提示一下。

支持小数秒的三个类型在创建表时的方法相同,只是改一下类型名称,后面将不再重复。
1、TIME

TIME类型为什么小时可以是-838~838?
答:为了方便取间隔时间。比如张三从周一的某个时间点开始打游戏,一直没睡觉,周四住院了,从他打游戏到身体支撑不住共计多少小时、多少分钟、多少秒?
TIME类型一共有三种写法:
(1)HH:MM:SS

如果写成 05:2:1 会自动修证成 05:02:01
注意事项:小时的范围,但是分钟和秒都是60进制,最高只能写到59

当分钟和秒大于59时,就会报错

(2)HHMMSS 省略冒号,我最常用的方法,但是注意别偷懒

这样写是可以的,但是我建议你将小时、分钟、秒写全,个位数前面补一个0
例如:18:05:03 请写成 180503
如果你写成1853,MySQL会识别成 18:53

我个人的建议,你不要去研究错了以后会有什么后果,要保证不出错。
(3) D HH:MM:SS
这里的D代表几天,1天是24小时,2天48小时,用得到的小时+后面的时间中的小时
但是要注意上限和下限

超出小时上限和下限就会报错

友情提示:使用字符串方式可以通过代码完成,不可以直接在这里输入,同上面的DATE函数
2、DATETIME
(1)时间范围:1000-01-01 00:00:00[.000000]~9999-12-31 23:59:59[.999999]
(2)两种推荐的输入方法

另外,在可视化界面输入现在时间,只需要鼠标点击就可以了,如果使用代码那值为 Now() 这些函数在后续课程中会逐一讲解。

友情提示:使用字符串方式可以通过代码完成,不可以直接在这里输入,同上面的DATE函数
3、TIMESTAMP
取值范围在图2-44中已经显示,不再重复。
这里要提一下,什么时候用TIMESTAMP(时间戳) ? 什么时候用 DATETIME(日期时间)?
答:如果您正在跨时区使用应用程序,并且需要日期时间来反映结果,请使用TIMESTAMP时间戳。如果无论时区如何都需要一致性结果,请使用datetime(日期时间)。
它会在存储前转换为UTC(世界统一时间),然后在检索时转换回当前时区设置。因此,如果时区设置在存储和检索之间发生更改,您将得到不同的值;但是它们却对应于相同的UTC日期时间。
从我孙兴华的英文口语你们就应该知道,我不可能在跨国企业工作,所以这个我用不到:)