SQL恰好在3周前获得了最近更新的DATETIME字段

时间:2018-10-30 20:05:41

标签: datetime mariadb

这与我过去在DATE字段中使用的查询相同,但是在DATETIME字段中则无效。

SELECT
    *
FROM 
    user_log
WHERE 
    log_updated = DATE_SUB(DATE(NOW()), INTERVAL 21 DAY);

我想确切地说是21天前的日期,但是可以是当天的任何时间。我不希望21天以上(或21天以下)。

2 个答案:

答案 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上使用索引。