mySQL复杂函数使用&日期使用

2020-12-21

1. case、when使用

在使用排序时,可能会使用到case、when进行优先级判断排序

案例1 按照关联内容优先排序

order by
  case when a.enroll_end_time >= #{nowTime} then 1 else 0 end desc,
  case when f.dict_label= #{province} then 1 else 0 end desc,
  case when g.dict_label = #{city} then 1 else 0 end desc

注:#{} 是mybatis传入的值

这里使用case、when进行优先级

2. 查询日期是今天

-- go.order_time 为示例,根据实际情况从业务表中取
to_days(go.order_time) = to_days(now())

3. 查询最近七日

-- 包括今日起 往前推6日
TO_DAYS(NOW()) - TO_DAYS(order_time) = 6
-- 包括今日起 往前推5日 
TO_DAYS(NOW()) - TO_DAYS(order_time) = 5
-- 昨日 
TO_DAYS(NOW()) - TO_DAYS(order_time) = 1

-- 如果是x日内,则可以用 <= 表示 示例:3日内
TO_DAYS(NOW()) - TO_DAYS(order_time) <= 3

4. 查询本周内数据

  • 使用YEARWEEK()函数来查询今日是几年的第几周,默认一周起始日为周天
  • 使用YEARWEEK(日期,1) 使用参数 1 来修改一周起始日为周一
-- 查询本周数据 例如今日是周二 则查询周一~周日的数据 order_time为示例,根据业务情况取
WHERE YEARWEEK(date_format(order_time,'%Y-%m-%d'),1) = YEARWEEK(now(),1)
-- 查询上周数据
WHERE YEARWEEK(date_format(order_time,'%Y-%m-%d'),1) = YEARWEEK(now(),1) - 1
-- 查询上上周
WHERE YEARWEEK(date_format(order_time,'%Y-%m-%d'),1) = YEARWEEK(now(),1) - 2

5. 查询本周的起始/结束日期

  • subdate() 函数,对日期进行减运算
  • WEEKDAY()函数,返回date的星期索引(计算当前日期所在一周内的index,周一为0,周二为1…..)
-- 查询本周的开始日期(周一)和结束日期(周日)
select subdate(CURDATE(),WEEKDAY(CURDATE())) as 起始, 
			 subdate(CURDATE(),WEEKDAY(CURDATE()) - 6) as 结束;
-- 查询上周的开始日期和结束日期
SELECT subdate(CURDATE(),WEEKDAY(CURDATE()) + 7) as 起始,
       subdate(CURDATE(),WEEKDAY(CURDATE()) + 1) as 结束,
-- 查询上上周的开始日期和结束日期
SELECT subdate(CURDATE(),WEEKDAY(CURDATE()) + 14) as 起始,
       subdate(CURDATE(),WEEKDAY(CURDATE()) + 8) as 结束,
-- 查询上上上周的开始日期和结束日期
SELECT subdate(CURDATE(),WEEKDAY(CURDATE()) + 21) as 起始,
       subdate(CURDATE(),WEEKDAY(CURDATE()) + 15) as 结束,

6. 查询本月的起始/结束日期

-- 获取当前月第一天
select date_add(date_add(last_day(now()),interval 1 day),interval -1 month);
-- 获取当前月最后一天
select last_day(NOW());

7. 对查询结果显示序号

  • 使用 自定义参数的方式

示例:

SELECT ro.des_province_name as smc, count(1) as jsymydsl, @row_num := @row_num + 1 as px
FROM go_order go
        JOIN req_order ro on ro.go_order_id = go.go_order_id,
        (
            SELECT @row_num := 0
        ) as row
WHERE go.scheduling_type = 'DV'
    AND go.order_status <> '2'
    AND go.is_deleted <> 1
GROUP BY ro.des_province_code
ORDER BY px;

8. COALESCE 空值处理

  • COALESCE(a1,b1) 空值处理函数,如果a1为空,则返回b1

  • 也可以填写多个参数连用:

    COALESCE ( expression,value1,value2……,valuen) 
    -- 如果expression不为空值则返回expression;否则判断value1是否是空值,
    -- 如果value1不为空值则返回value1;否则判断value2是否是空值,
    -- 如果value2不为空值则返回value2;……以此类推,
    -- 如果所有的表达式都为空值,则返回NULL。 
    

9. IF 函数

  • 使用IF函数来进行判断

  • IF(表达式,a1,b1)如果表达式为true,则返回a1,否则返回a2

  • 示例

    -- 如果创建时间在本月,则返回1 ,否则返回0
    IF(tr.create_time between date_add(date_add(last_day(now()), interval 1 day), interval -1 month) AND last_day(NOW()),'1', '0')       
    

10. group_concat

  • 使用group_concat将结果集进行合并,将选择的字段合并到一个字段进行显示,且默认用逗号进行隔开
select t.tra_order_no, group_concat(t.sum, mdc.dict_name)
from (
         select tr.tra_order_no, gc.package_type, SUM(gc.cargo_package) as sum
         from tra_order tr
                  join go_cargo gc on gc.business_id = tr.tra_order_id AND gc.business_type = 'traOrder'
         group by tr.tra_order_no, gc.package_type
     ) t
         join md_dict_code mdc on mdc.dict_code = t.package_type and mdc.dict_type_code = 'LOGINK_PACKAGE_TYPE'
group by t.tra_order_no;