如何在SQL中查询从当前日期起过去1个月的数据?
如何在SQL中获取当前日期起过去1个月的数据
嘿,我来帮你搞定这个需求,先梳理下原查询里的几个小问题,再给出正确的写法:
原查询的问题点
- 日期范围顺序错误:
BETWEEN CURDATE() AND date_sub(CURDATE(), INTERVAL 30 DAY)里,BETWEEN要求左侧日期小于等于右侧日期,但你把当前日期放在前面、30天前的日期放在后面,会直接导致没有数据匹配。 - 逻辑运算符优先级问题:原WHERE子句里的
OR和AND组合没加正确的括号,可能会让筛选逻辑偏离你预期的效果。
修正后的SQL写法
场景1:取过去30天的固定天数数据
SELECT * FROM user_claim_tag LEFT JOIN tasks ON user_claim_tag.task_id = tasks.id LEFT JOIN users ON user_claim_tag.user_id = users.uid LEFT JOIN user_details ON user_details.usr_id = users.uid WHERE tasks.is_deleted = 'N' AND (user_claim_tag.complete = 'Y' OR user_claim_tag.complete = 'NS') AND complete_dt >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND complete_dt <= CURDATE() ORDER BY complete_dt DESC
场景2:取过去1个自然月的数据(比如今天是5月15日,取4月15日到5月15日的数据)
SELECT * FROM user_claim_tag LEFT JOIN tasks ON user_claim_tag.task_id = tasks.id LEFT JOIN users ON user_claim_tag.user_id = users.uid LEFT JOIN user_details ON user_details.usr_id = users.uid WHERE tasks.is_deleted = 'N' AND (user_claim_tag.complete = 'Y' OR user_claim_tag.complete = 'NS') AND complete_dt >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND complete_dt <= CURDATE() ORDER BY complete_dt DESC
对应的PHP执行逻辑
// 这里以"过去1个自然月"的SQL为例 $sql = "SELECT * FROM user_claim_tag LEFT JOIN tasks ON user_claim_tag.task_id = tasks.id LEFT JOIN users ON user_claim_tag.user_id = users.uid LEFT JOIN user_details ON user_details.usr_id = users.uid WHERE tasks.is_deleted = 'N' AND (user_claim_tag.complete = 'Y' OR user_claim_tag.complete = 'NS') AND complete_dt >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND complete_dt <= CURDATE() ORDER BY complete_dt DESC"; $ex = $this->db->query($sql); $data['data'] = $ex->result();
补充小提示
- 用
>=和<=比BETWEEN更直观,能有效避免日期顺序搞反的问题; - 如果
complete_dt字段包含时分秒(比如格式是YYYY-MM-DD HH:MM:SS),可以把CURDATE()换成CURRENT_TIMESTAMP,确保能匹配到当天所有时间点的数据; - 调整后的WHERE子句括号,保证
complete的两个状态是OR关系,再和其他筛选条件做AND关联,更贴合业务逻辑。
内容的提问来源于stack exchange,提问作者Swetalina Ray
相关产品推荐
相关产品推荐

