mysql入门-数据类型(二)
今天说一下mysql的数据类型日期,mysql的日期类型有date、datetime、time、year、timestamp。
date其实就是日期,例如2019年07月27日,这就是日期。而时间呢,时间就是20:31,这就是时间的类型,也就是time。datetime就是将date和time合在了一起,例如2019-07-27 20:31了,year就不用说了,年份,timestamp就是一个时间戳,类似于datetime。接下来看一下演示代码以及结果。
date:
-- 建表语句
drop table if exists test_06;
create table test_06(
a date,
b time,
c datetime,
d year,
e timestamp
)
desc test_06;
查看一下各个字段的类型
好了,咱们现在来插入数据,现在咱们不用sql语句来插,而是使用navicat来插入语句。
以b为例,定义的b为time类型,当插入数据的时候,可以看到,只弹出来要插入的时间,对了,这就是time类型的。看到a已经被我插入了,a的类型是date类型,看到的就如图所示。d这个是year类型,这个类型进行插入的时候并没有什么约束,能随意插入数据。来看一下最后的结果。
说明一下,最后一个字段我并没有插入,而是自动填好的,这就是timestamp的含义,他记录的是你当前修改这个表的时间,当然,你也可以选择去自己插入这个,如果不是手动插,那么就会自动帮着补上。我修改了一下a字段。e字段也会跟着改变。
这个timestamp一般用来记录修改此条记录的时间信息。
下面说一下mysql关于操作时间的函数吧。
获取当前时间的函数:now()、sysdate()、current_timestamp()、current_timestamp、current_date()、current_time()、curdate()、curtime().
下面是演示内容
但是这么多函数,彼此之间有什么区别呢,典型的例子就是now()这个函数,
select now(),sleep(3),now();
可以看到,中间线程睡了3秒钟,可是时间还是和第一个查出来的时间相同,这就是now()和其它获取当前时间函数的区别,now()会在执行sql语句的时候预分配好时间,不管线程睡眠多长时间,都是相同的结果。换成其他函数,就没有这种现象了,咱们试一下。
select SYSDATE(),sleep(3),SYSDATE();
这回结果就不相同了,这就是区别,其它的那几个就没有什么区别了。
字符串转化为时间的函数:
str_to_date(str, format)先演示一下这个函数的使用
select STR_TO_DATE('1998-02-11 12:01:32','%Y-%m-%d %H:%i:%s')
可以看到,这样就将字符串转化为了日期,里面有一些通配符,这里面的通配符和其它语言的转化时间的通配符可能有些出入,解释一下通配符的含义
%Y 代表年
%m 代表月
%d 代表日
%H 代表小时
%i 代表分钟
%s 代表秒
这些通配符一定要掌握,重中之重,后面还会用到的。
其他的字符串转化为时间的函数DATE_FORMAT(str, format),TIME_FORMAT(str, format)这两个和上一个函数的使用方法一样,只不过TIME_FORMAT(str, format)这个函数是专门转化时间所使用的。
接下来这个函数是将时间转化为天数以及将天数转化为时间,可能这么说有点小抽象,上代码
select TO_DAYS(SYSDATE());
可以看到结果为一个整型数字,我来解释一下这个数字的含义,这个数字的含义就是距离公元0000年的天数。
select TO_DAYS('0000-01-01')
这回结果直观了吧。
还有一个函数就是from_days(days),也不多说,先看代码
select FROM_DAYS(1243);
此函数的意义就是将一个天数转化为以0000年为开始节点的时间。
在介绍两个转化时间的函数:time_to_sec(time)、sec_to_time(sex)
select TIME_TO_SEC(SYSDATE());
这个函数的功能就是将时间,注意,是time,而并非date转化为秒数。
另一个函数就是将秒数转化为时间
select SEC_TO_TIME(3600)
正正好好3600秒就是一个小时。
日期拼接函数makedate(year, days of year)、maketime(hour, minute, second)
select makedate('2014', 366);
select maketime(12,14,04);
day_of_year这个参数的意思就是一年中的天数,而不是一个月中的天数。
日期计算函数date_add()、date_sub()、date_diff()、timestamp()、timestampadd()、timestampdiff()。
date_add()
select date_add(SYSDATE(), INTERVAL 1 year);
select date_add(SYSDATE(), INTERVAL 1 year);
select date_add(SYSDATE(), INTERVAL 1 month);
select date_add(SYSDATE(), INTERVAL 1 day);
select date_add(SYSDATE(), INTERVAL 1 hour);
select date_add(SYSDATE(), INTERVAL 1 minute);
select date_add(SYSDATE(), INTERVAL 1 second);
date_sub()的功能就是减去一个日期,和date_add()的方法使用相同,这里就不演示了,小伙伴们练习一下吧。
datediff()。datediff()就是两个时间相减,注意,得到的只是天数。
select datediff(SYSDATE(), '2018-12-09 13:01:23')
* 得到的只是天数
timestamp()。单纯的使用timestamp只是得到指定显示的时间。例如
select TIMESTAMP('2019-12-02 14:09:36');
还有另一种用法
select TIMESTAMP(SYSDATE(), CURRENT_TIME);
# select timestamp(date, time) date+time
接下来说一下timestampadd
select TIMESTAMPADD(hour, 1, SYSDATE());
# timestampadd(unit, count, date) unit为单位,就是hour,second等,count就是加的数量,date就是指定的时间
timestampdiff(),我个人认为这个时间相减的函数比datediff好用很多,这个函数比较灵活,可以指定相减之后得到的数据展现方式,即以天展示,还是以小时的方式展示。
select timestampdiff(day, SYSDATE(), '2020-12-10');
select timestampdiff(year, SYSDATE(), '2020-12-10');
# timestampdiff(unit, firstdatetime, seconddatetime) unit(seconddatetime - firstdatetime)
所以个人推荐以后做两个时间相减的操作,使用timestampdiff()。
今天就说这么多,已经是半夜00:06了,洗洗睡吧。
未完,待续。。。。。。