实现查询收费未及时结账的功能(考虑节假日和周末)MySQL版

持久化框架:MybatisPlus

因最近业务需要,很多统计功能模块要求在以前查询所有数据的情况下提供一个只查询收费后不及时结账的单选框,选中此单选框后只查询出未及时结账的数据(正常工作日周一至周四收的费在第二天24点前未及时结账算不及时;周五、周六、周日的在下周一24点前未结账算不及时;节假日及放假前一天的在收假后第一天未结账的算不及时);查询的数据源是Mysql,我新建了一个存节假日的表,如下:

因这种太简单,就直接上sql了(待优化):

<!--新加参数说明:
               c.jzsj表示收款的实收时间、b.xzsj 表示结账时间
               wjs:表示前台选中了未及时日结
               -->

<select id="getFLZB_zzxzjslInfo" resultType="map"> SELECT a.dqbm DQBM,(SELECT dmbmmc FROM xt_dmbm WHERE dmbmnm='DQBM' AND dmbm=a.dqbm) DQBM_MC,b.gddwbm GDDWBM, a.DWBM DWBM,(SELECT REPLACE(zzmc,'德玛西亚有限责任公司','') FROM xt_zz WHERE zzbm=a.DWBM) DWBM_MC,a.jfpzdjh JFPZBH,b.xzsj XZSJ,c.jzsj JZSJ, b.pdhm PDHM,b.cpyhzh CPYHZH,b.cpr CPR,b.bzsm BZ,a.dzbs DZBS FROM dz_dzmx_pd a,zw_jfpzxx b,(SELECT dzbs,MIN(DATE_FORMAT(jzsj,'%Y-%m-%d')) jzsj FROM dz_dzmx_cw WHERE dqbm=#{dqbm} GROUP BY dzbs) c <if test="wjs=='1'.toString()"> ,(select * from dz_jjr where DATE_FORMAT(KSRQ,'%Y-%m')=#{month} or DATE_FORMAT(JSRQ,'%Y-%m')=#{month} or DATE_FORMAT(KSRQ,'%Y-%m')=DATE_FORMAT(DATE_SUB(CONCAT(#{month},'-01'),INTERVAL 1 MONTH),'%Y-%m') or DATE_FORMAT(KSRQ,'%Y-%m')=DATE_FORMAT(DATE_SUB(CONCAT(#{month},'-01'),INTERVAL 1 MONTH),'%Y-%m') or DATE_FORMAT(KSRQ,'%Y-%m')=DATE_FORMAT(DATE_SUB(CONCAT(#{month},'-01'),INTERVAL -1 MONTH),'%Y-%m') or DATE_FORMAT(KSRQ,'%Y-%m')=DATE_FORMAT(DATE_SUB(CONCAT(#{month},'-01'),INTERVAL -1 MONTH),'%Y-%m')) jjr </if> WHERE a.jfpzdjh=b.jfpzdjh <if test="wjs=='1'.toString()"> and (case when(c.jzsj between DATE_SUB(jjr.ksrq,INTERVAL 1 DAY) and jjr.jsrq and b.xzsj > DATE_SUB(jjr.jsrq,INTERVAL -1 DAY)) then 1 when(c.jzsj not between jjr.ksrq and jjr.jsrq and ((DATE_FORMAT(c.jzsj,'%w') in ('5','6') and b.xzsj > DATE_SUB(c.jzsj,INTERVAL WEEKDAY(c.jzsj) - 7 DAY)) or (DATE_FORMAT(c.jzsj,'%w') in ('1','2','3','4','0') and b.xzsj > CONCAT(DATE_SUB(c.jzsj,INTERVAL -1 DAY)," 23:59:59")) ) ) then 1 else 2 END) = 1 </if> <if test="dwbm!=null and dwbm!=''"> AND a.DWBM=#{dwbm} </if> <if test="gddwbm!=null and gddwbm!=''"> AND b.gddwbm LIKE CONCAT(#{gddwbm},'%') </if> <if test="rybm!=null and rybm!=''"> AND b.PDDJRBM=#{rybm} </if> <if test="rybs!=null and rybs!=''"> AND b.xzrbs=#{rybs} </if> <if test="day!=null and day!=''"> AND DATE_FORMAT(b.xzsj,'%Y-%m-%d')=DATE_FORMAT(#{day},'%Y-%m-%d') </if> <if test="month!=null and month!=''"> AND DATE_FORMAT(b.xzsj,'%Y-%m')=DATE_FORMAT(CONCAT(#{month},'-01'),'%Y-%m') </if> <if test="jfqd!=null and jfqd!=''"> AND b.PDLXDM=#{jfqd} </if> AND a.dzbs=c.dzbs AND a.pdlxdm NOT IN ('18','13','25') AND a.dqbm=#{dqbm} AND b.dqbm=#{dqbm} GROUP BY a.dqbm,b.gddwbm,a.DWBM,a.jfpzdjh,b.xzsj,c.jzsj, b.pdhm,b.cpyhzh,b.cpr,b.bzsm,a.dzbs ORDER BY a.dwbm,b.xzsj </select>

以上就是初步sql,这种方式会导致查出重复数据,是因为节假日表里最近三个月不一定只有一个节假日,所以我加了个GROUP BY去重,但是这种方式是需要优化的,DDDD。

mysql关于星期的一些知识:
SELECT DATE_FORMAT(DATE_SUB(ksrq,INTERVAL 0 MONTH),'%Y-%m') from dz_jjr where DATE_FORMAT(ksrq,'%Y-%m')='2021-09';-- 当前月份-0
SELECT DATE_FORMAT('2021-09-06','%w') a from dz_jjr where DATE_FORMAT(ksrq,'%Y-%m')='2021-09'
SELECT DATE_FORMAT('2021-09-07','%w') a from dz_jjr where DATE_FORMAT(ksrq,'%Y-%m')='2021-09'
SELECT DATE_FORMAT('2022-01-13','%w') a from dz_jjr where DATE_FORMAT(ksrq,'%Y-%m')='2021-09'
SELECT DATE_FORMAT('2022-01-15','%w') a from dz_jjr where DATE_FORMAT(ksrq,'%Y-%m')='2021-09'
-- mysql 一个周(周一1 周二2 周三3 周四4 周五5 周六6 周日0)是从周一开始到周日,即下周一就是下周开始的第一天 SELECT DATE_FORMAT(curdate(),'%w')
-- oracle 一个周(周日1 周一2 周二3 周三4 周四5 周五6 周六7)是从周日开始到周六,即周日就是下周开始的第一天 SELECT to_char(to_date(SYSDATE,'YYYY-MM-DD'),'D')  from dual;-- 周六结果为7,周日结果为1,周一为2
 
SELECT DATE_FORMAT('2022-01-16','%w') a from dz_jjr where DATE_FORMAT(ksrq,'%Y-%m')='2021-09';-- 查看当天是周几(周一——周日:1 2 3 4 5 6 0)
SELECT DATE_SUB(curdate(),INTERVAL WEEKDAY(curdate()) + 0 DAY);-- 查看当前时间的周一日期
SELECT DATE_SUB('2022-01-13',INTERVAL WEEKDAY(curdate()) - 6 DAY);-- 查看当前时间的周日日期
SELECT DATE_SUB('2022-01-13',INTERVAL WEEKDAY('2022-01-13') - 6 DAY);-- 查看当前时间的周日日期
SELECT DATE_SUB('2022-01-13',INTERVAL WEEKDAY('2022-01-13') - 7 DAY);-- 查看下周第一天
SELECT DATE_SUB('2022-01-13',INTERVAL WEEKDAY('2022-01-13') - 7 DAY);-- 查看下周第一天 单纯就是日期变为下周一
SELECT DATE_SUB('2022-01-13 20:12:01',INTERVAL WEEKDAY('2022-01-13') - 7 DAY);-- 查看下周第一天 单纯就是日期变为下周一 时间不变 2022-01-17 20:12:01
SELECT DATE_SUB('2022-01-07 20:12:01',INTERVAL WEEKDAY('2022-01-13') - 7 DAY);-- 查看下周第一天 单纯就是日期变为下周一 2022-01-11 20:12:01
SELECT DATE_SUB('2022-01-13',INTERVAL 1 DAY);-- 查看上一天日期(日期-1)
SELECT DATE_SUB('2022-01-13 20:12:01',INTERVAL 1 DAY);-- 查看上一天时间(日期-1)
SELECT DATE_SUB('2022-01-13',INTERVAL -1 DAY);-- 查看下一天日期(日期+1)
SELECT DATE_SUB('2022-01-13 20:12:01',INTERVAL -1 DAY);-- 查看下一天时间(日期+1)
原文地址:https://www.cnblogs.com/xyg34/p/15808090.html