MySQL IF、case when的使用,获取本月倒数第几个工作日、从前、后截取字符

MySQL获取某一天的某一个时间点:
获取本月最后一天日期

LAST_DAY(CURDATE())

指定日期减去一定的天数,可以为负数

SELECT DATE_SUB((SELECT LAST_DAY(CURDATE())),INTERVAL 3 DAY)

字符拼接

CONCAT('A','B')

日期格式化

SELECT STR_TO_DATE('2020-01-09 10:00:00','%Y-%m-%d %H')

如下获取本月最后一天减去22天后的日期,并用concat拼接获取那一天的18点,然后用STR_TO_DATE格式化为日期时间格式

SELECT STR_TO_DATE(CONCAT((SELECT (DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 22 DAY))),' 18:00:00'),'%Y-%m-%d %H')

截取字符

从右向左、从左向右截取,截取三位

right(str, 3);
left(str, 3);

数字四舍五入保留指定位小数
num是要计算的数字,n是保留的小数位数,n可以是负数、0、正数,也可以不写n,不写默认为0,如下

SELECT round(num, n);
SELECT round(123.456);#123
SELECT round(123.456,0);#123
SELECT round(123.456,1);#123.5
SELECT round(123.456,2);#123.46
SELECT round(123.456,-1);#120
SELECT round(123.456,-2);#100
SELECT round(123.456,-3);#0

分组求和函数
如下,查询订单数据,根据订单编号分组,对price进行求和

SELECT code,sum(price) price from order where code = '123' group by code;

分组统计计数
查询订单数据,根据code分组,统计对应分组有多少条数据

SELECT code,count(id) id from order group by code;

IF函数判断

SELECT IF(4<5,'对','错')
SELECT IFNULL('TRUE','FALSE')

MySQL用IF判断是本月倒数第三个工作日返回不同结果:
如下用IF判断本月的最后一个一天是周几,根据获取的星期几减去对应的天数即可获取想要的本月倒数第几个工作日,因为SQL中没法用IF ELSE, 所以无法用IF ELSE去进行多次判断,但是最后一天只能是固定的星期几,所以我们可以拼接多个判断与具体的星期几比较达到多次关联判断的效果,以实现目的,判断符合后返回需要返回的结果,可以保证结果不会重复。

SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Monday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 5 DAY)),'')),'是','否') UNION
SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Tuesday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 4 DAY)),'')),'是','否') UNION
SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Wednesday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 3 DAY)),'')),'是','否') UNION
SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Thursday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 3 DAY)),'')),'是','否') UNION
SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Friday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 3 DAY)),'')),'是','否') UNION
SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Saturday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 4 DAY)),'')),'是','否') UNION
SELECT IF((SELECT NOW())<(SELECT IF((SELECT DATE_FORMAT((SELECT LAST_DAY(CURDATE())), '%W')='Sunday'),(DATE_SUB((SELECT LAST_DAY(CURDATE())), INTERVAL 5 DAY)),'')),'是','否')

根据上面的案例也可以获取倒数第几个工作日的日期,写法差不多,在此不再细写。
以上的结果也可以用case when 来实现多层循环匹配返回结果,如一个查询要查询出某个字段中包含某个字符的个数来匹配返回不同的结果。具体事例如下:
这里是查询path字段中包含“/”的个数来判断返回当前层级。
case是查询的结果,when是比较判断的值,then是返回的结果,else是匹配除现有判断的其他所有结果集返回值,end是结束case循环

SELECT 
  t.*,
  CASE
    LENGTH(t.path) - LENGTH(REPLACE(t.path, '/', '')) 
    WHEN '2' 
    THEN '一级' 
    WHEN '3' 
    THEN '二级' 
    WHEN '4' 
    THEN '三级' 
    ELSE '其他' 
  END AS level_name 
FROM
  menu t 
WHERE 1 = 1 ;

这里是查询path的总长度,然后替换其中的"/“为空,然后用原长度减去替换后的长度即是”/“的个数。
然后when判断是有几个”/",在then中返回具体显示结果,else中返回其他返回结果。记得写end 否则会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值