这与我过去在DATE字段中使用的查询相同,但是在DATETIME字段中则无效。
SELECT
*
FROM
user_log
WHERE
log_updated = DATE_SUB(DATE(NOW()), INTERVAL 21 DAY);
我想确切地说是21天前的日期,但是可以是当天的任何时间。我不希望21天以上(或21天以下)。
答案 0 :(得分:4)
您可以执行以下操作:
SELECT
*
FROM
user_log
WHERE
DATE(log_updated) = DATE(NOW() - INTERVAL 21 DAY);
但这不是一个有效的解决方案(sargable),因为在Column上使用函数会阻碍索引的使用(如果已定义)。
因此,更好的方法是:
SELECT
*
FROM
user_log
WHERE
log_updated >= DATE(NOW() - INTERVAL 21 DAY) AND
log_updated < DATE(NOW() - INTERVAL 20 DAY)
通知,我已经在要求的日期之后的第二天使用了最大限制检查(不包括在内)。它是通过INTERVAL -20 DAY
答案 1 :(得分:0)
由于DATE(NOW())
与CURDATE()
相同,因此您最好使用
WHERE log_updated >= CURDATE() - INTERVAL 21 DAY
AND log_updated < CURDATE() - INTERVAL 20 DAY
这可能会使用log_updated
上的索引。
相反,DATE(log_updated) ...
不能在log_updated
上使用索引。