最近遇到这样的一个需求:有一组数据,这组数据有一个字段叫支付时间,现在要筛选出这些数据中最近三个月有过支付情况,且三个月前无支付情况的记录。
首先观察下数据集字段,经过处理后,保留了5个字段,其中当前时间是原表没有的,统一用12月1日作为当前时间,增加这个字段的目的是用当前时间减去支付时间,得出时间差。
了解完数据集基本情况后,接下来就要回到需求,如何查询出有且仅有近三个月支付记录的编码。上一步我增加字段已经考虑到,计算出时间差,用timestampdiff函数,时间差=timestampdiff(month,支付时间,当前时间),再筛选时间差小于等于3的记录,得到的结果就是有且仅有近三个月支付的记录,代码如下:
“select * from (
select*,timestampdiff(month,支付时间,当前时间) 时间差 from table1)a
where 时间差 <=3;”
这个结果是对的吗?以上代码查询出的结果是不对的,这段代码只是查询出近三个月有支付的记录,并没有排除三个月前有支付的情况,所以查询出的结果是不对的。
怎么办呢?当时我想了一小会,这个需求从正面来实现是比较难的,那能不能从另一面来突破。思路不复杂,先查询出三个月前有支付的记录,再用总的记录匹配出三个月前有支付的记录,剩下未匹配到的就是仅有近三个月支付记录的编码,只需把上面的代码改个符合即可:
“select * from (
select*,timestampdiff(month,支付时间,当前时间) 时间差 from table1)a
where 时间差 >3;”
最后用匹配后的结果进行验证,思路是正确的。