我使用以下查询来定位比当前时间早X天的结果。
SELECT *,
DATE_FORMAT(datetime, '%m/%d/%Y')
FROM table
WHERE datetime BETWEEN SYSDATE() - INTERVAL 30 DAY
AND SYSDATE()
ORDER BY ID DESC
如果30天前的记录不存在,以及无关数据,问题是它从当天返回的数据
有更好的方法吗?
答案 0 :(得分:29)
BETWEEN
包括两个参数之间的所有值,包括每端的值。换句话说,BETWEEN 1 AND 4
包括值1,2,3和4.不仅仅是1和4,而不仅仅是2和3。
如果您只想要30天前的某一天的日期,请尝试:
SELECT *,
DATE_FORMAT(datetime, '%m/%d/%Y')
FROM table
WHERE DATE(datetime) = CURDATE() - INTERVAL 30 DAY
ORDER BY ID DESC
使用CURDATE()
代替SYSDATE()
,因为CURDATE()
会返回没有时间组件的日期。
答案 1 :(得分:10)
您的查询设置为获取今天(包括时间)和之前30天之间的记录。
如果您想要超过30天(到时间)的记录,请使用:
SELECT *,
DATE_FORMAT(datetime, '%m/%d/%Y')
FROM table
WHERE datetime <= DATE_SUB(SYSDATE(), INTERVAL 30 DAY)
ORDER BY ID DESC
如果您想要那些只有30天,而不是31或29,而不考虑时间部分 - 使用:
SELECT *,
DATE_FORMAT(datetime, '%m/%d/%Y')
FROM table
WHERE DATE_FORMAT(datetime, '%m/%d/%Y') = DATE_FORMAT(DATE_SUB(SYSDATE(), INTERVAL 30 DAY), '%m/%d/%Y')
ORDER BY ID DESC