Mysql获得当前日期的前一个月的最后一天
场景:一家P2P公司的财务专员请求开发人员(或DBA)统计历史借款用户数量,她查看的时间是今天,想要的数据是这个月以前(不含这个月)的用户数。 难题:“这个月”是动态的,可能是2016年7月、2017年3月等等。我们就需要写一个动态SQL给她以后就让她自己执行就OK了。 思路:如果我们可以找到一个条件时间,然后用户借款时间小于这个条件时间的所有数据就是她想要的结果了。关键就是确定这个条件时间了。 DB表ACCOUNT,账户ID:ACCT_ID借款时间PAY_DATE。 我们想要的应该是这样的SQL:
代码语言:javascript复制SELECT COUNT(ACCT_ID) FROM ACCOUNT WHERE DATE_FORMAT(PAY_DATE, '%Y%m%d') <= 条件时间
如果这个条件时间是当前时间上一个月最后一天该有多好,直接替换就行了。 是的,那我们就根据当前时间找到条件时间(当前时间上一个月最后一天)吧:
在Mysql获得当前日期的所在月的第一天一节中我们已经拿到了当前日期的所在月的第一天,这个日期减去24个小时该多好,下面就这样做吧: date_sub(arg1, arg2): 参数arg1是时间,arg2是和date_add函数类似的参数形式interval 小时数N 运算单位hour(空格符分隔), 表示当前时间减去N个小时(单位hour是可以选择的— day、year等)
代码语言:javascript复制select date_add(curdate(),interval -day(curdate()) 1 day)
result: 2017-07-01
select date_sub('2016-07-01', interval 24 hour)
result: 2016-06-30 00:00:00
select date_sub(date_add(curdate(),interval -day(curdate()) 1 day), interval 24 hour)
result: 2016-06-30 00:00:00 ##我们想要的【条件时间】
但是我们想要的形式是20160630,所以需要格式化日期。使用date_format函数: date_format(arg1, ‘%Y%m%d’): 将arg1转成20160714形式 date_format(arg1, ‘%Y-%m-%d’): 将arg1转成2016-07-14形式 date_format(arg1, ‘%Y%m%d%H%i%s’): 将arg1转成20160714140821形式 date_format(arg1, ‘%Y%-m-%d %H:%i:%s’): 将arg1转成2016-07-14 14:08:21形式
代码语言:javascript复制select date_format(date_sub(date_add(curdate(),interval -day(curdate()) 1 day), interval 24 hour), '%Y%m%d') ##【条件时间】
result: 20160630
最终SQL:
代码语言:javascript复制SELECT COUNT(ACCT_ID) FROM ACCOUNT WHERE DATE_FORMAT(PAY_DATE, '%Y%m%d') <=
date_format(date_sub(date_add(curdate(),interval -day(curdate()) 1 day), interval 24 hour), '%Y%m%d')