SELECT
id,
source AS source,
DATE(DATE_SUB(statistic_time, INTERVAL DAYOFMONTH(statistic_time) - 1 DAY)) AS __timestamp,
SUM(pay_money) AS `SUM(pay_money)`
FROM
t_cal_sume
WHERE
statistic_time >= STR_TO_DATE('2018-05-20 00:00:00', '%Y-%m-%d %H:%i:%s')
AND statistic_time <= STR_TO_DATE('2019-05-20 00:00:00', '%Y-%m-%d %H:%i:%s')
AND flag = 1
AND id < 300
GROUP BY
source,
DATE(DATE_SUB(statistic_time, INTERVAL DAYOFMONTH(statistic_time) - 1 DAY))
ORDER BY
`SUM(pay_money)` DESC LIMIT 10000;
分析如上sql:
DAYOFMONTH(time) 是返回此日期time在它当月属于第多少天
DATE(DATE_SUB(statistic_time, INTERVAL DAYOFMONTH(statistic_time) - 1 DAY))
如下图:
DATE_SUB() 函数:
从日期减去指定的时间间隔
语法
DATE_SUB(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是你希望添加的时间间隔。
DATE_SUB(statistic_time, INTERVAL DAYOFMONTH(statistic_time) - 1 DAY) 意思就是按天作为时间间隔
以上sql就是算出这天是本月第几天,这个就是时间间隔,将这个日期减去时间间隔换算为本月1号,如果求本月合计的话就把当月1号累加即可。