九 其他单日期简单查询
除了上面的基本操作之外,单个日期还有一些其他的操作。
九.一 展示月名 monthname(date)
将月名 默认按照英文进行展示。
select monthname(now());
November 为11月的英文单词。
九.二 展示星期的名 dayname(date)
将星期几 以英文的形式展示出来。
select dayname(now());
Wednesday 为星期三的英文单词。
九.三 展示工作日索引 weekday(d)
展示的也是 这一天,是这一周的第几个。
select weekday(now());
与 dayofweek() 类似 。但dayofweek() 是星期日表示1, 星期三表示4. 范围是 1~7.
而 weekday() 是星期一 表示0, 星期三表示 2. 范围是0~6.
推荐使用 dayofweek() 函数。
九.四 查询当前月的最后一天 last_day(date)
可以查询出,某个月的最后一天。
select last_day(now()),last_day('2019-02-03'),last_day('2000-02-04');
注意,只有 last_day(date) 函数,没有 first_day(date) 函数。 要查询当月的第一天,
可以 先查询出年,再查询出当前月,最后与 ‘01’ 进行拼接来表示。
九.五 提取日期 date(d1)
将日期 时间中的日期部分提取出来。
select date('1995-02-07 11:23:59'),date('1995-02-07');
九.六 提取时间 time(d1)
将日期 时间中的时间部分提取出来
select time('1995-02-07 11:23:59'),time('11:23:59');
九.七 改变 系统变量 lc_time_names
查询 monthname(), dayname() 时显示的是英文, 如果想让其显示中文呢, 要改变 lc_time_names的默认值。
默认是 en_US, 显示英文。
1 . 查询 变量 ‘lc_time_names’
show variables like 'lc_time_names';
2 .展示 monthname 和dayname
select monthname(now()),dayname(now());
3 . 改变变量 ‘lc_time_names’ 的值为 ‘zh_CN’ 中文。
set lc_time_names='zh_CN';
4 . 再次查询 monthname 和dayname
select monthname(now()),dayname(now());
发现,展示成相应的中文了。
5 . 不要忘记,再改回去噢
set lc_time_names='en_US';
十. 两个日期之间的比较函数
常见的有,一个日期,加上多少天,加上多少月,即往后,变成新的一天是什么。 一个日期,减去多少天,减去多少月,即往前,变成新的一天是什么。 也有比较一下,两个日期之间相差多少天。 也有时间,往前,往后的。
十.一 往后 添加参数 date_add(d1, interval n type) 和 addDate(d1,interval n type)
是往后,添加多少天,多少月的意思。 其中,date_add() 与addDate() 函数 是一样的,
只是 addDate() 可以不写类型,直接填充n, 变成 addDate(d1,n),不写时,默认填充的是天 Day,也可以填写负值。
而 date_add() 却不能省略,必须完整填写 (interval n type) ,且是正值。
推荐使用 date_add() 函数。
其中,后面的那个 type 的可取值范围 就是 extract() 函数中的 type 类型,即 六.一 中的那个表格。
但 用日期时, 一般用 Year,Month,Day 三个。
对于复杂的日期变换,可以进行嵌套 date_add() 函数。
如查询 当前日期往后一天的, 当前日期往后两个月的, 当前日期往后一月还有三天的
select now() as '1',addDate(now(),1) as '2',date_add(now(),interval 1 day) as '3', date_add(now(),interval 2 month) as '4', date_add(date_add(now(),interval 1 month),interval 3 day) as '5';
当前是 11-27日, 添加1天是 11-28日, 添加两个月是 2020-01-27,
添加一个月零3天是, 12-30。
十.二 往前 减去参数 date_sub(d1,interval n type) 和subDate(d1,interval n type)
是往前 减去多少天,多少月的意思。 其中,date_sub() 与subDate() 函数是一样的。
只是 subDate() 可以不写类型,直接填充民, 变成 subDate(d1,n),不写时,默认填充的是天 Day,也可以填写负值。
而 date_sub() 却不能省略,必须完整填写 (interval n type),且是正值。
推荐使用 date_sub() 函数。
对于复杂的日期变换,可以进行嵌套 date_sub() 函数。
如查询 当前日期往前一天的, 当前日期往前两个月的, 当前日期往前一月又三天的
select now() as '1',subDate(now(),1) as '2',date_sub(now(),interval 1 day) as '3', date_sub(now(),interval 2 month) as '4', date_sub(date_sub(now(),interval 1 month),interval 3 day) as '5';
当前是 11-27日, 减去1天是 11-26日, 减去两个月是 2019-09-27
减去一个月零3天是, 2019-10-24。
十.三 两个日期之间相差的整天数 DateDiff(d1,d2)
可以比较出两个日期相差的天数。 diff 为 Difference 的简写。
select DateDiff(now(),date_add(now(),interval 20 day)),DateDiff(now(),'2018-11-27');
如果d1>d2, 返回正数。 d1<d2, 返回负数。
十.四 时间相加的 addTime(t1,t2)
对时间的操作。 type 通常用 Hour,Minute, Second 三个类型。
select now(), addTime(time(now()),'0:01:20'),addTime(time(now()),'01:02:03');
当前是 17:08:29, 添加1分钟20秒为 17:09:49,
添加 1小时2分钟3秒,为 18:10:32 秒
十.五 时间相差 subTime(t1,t2)
select now(), subTime(time(now()),'0:01:20'),subTime(time(now()),'01:02:03');
当前是 17:10:52, 减去1分钟20秒为 17:09:32,
减去 1小时2分钟3秒,为 16:08:49
十一 日期和时间的格式化
类似于 java 中的 java.text.DateFormatter 类。
十一.一 格式化的类型
只列举业务开发中几个常见的说明符号。 注意,大小写是有区别的。
十一. 二 将日期转换字符串 date_format(d,f)
将当前日期转换成中文的形式。
select now(),date_format(now(),'%Y%m%d %H%i%S'),date_format(now(),'%Y年%m月%d日 %H小时%i分钟%S秒');
十一.三 将时间转换成字符串 time_format(t,f)
将当前日期转换成中文的形式
select now(),time_format(now(),'%H%i%S'),time_format(now(),'%H小时%i分钟%S秒');
十一.四 将字符串转换成日期 str_to_date(str,f)
将日期形式的字符串按照其能匹配的格式转换成相应的日期。
select str_to_date('27/11/2019','%d/%m/%Y') as '1',str_to_date('173223','%H%i%S') as '2', str_to_date('2019年11月27日','%Y年%m月%d日') as '3',time(str_to_date('17时32分23秒','%H时%i分%S秒')) as '4', str_to_date('27/11/2019 173223','%d/%m/%Y %H%i%S') as '5', str_to_date('2019年11月27日17时32分23秒','%Y年%m月%d日%H时%i分%S秒') as '6';
单独时间格式化的话,显示为null. 所以,str_to_date() 时把日期加上。
谢谢!!!