【问题标题】:SQL get a last updated DATETIME field from EXACTLY 3 weeks agoSQL 从 3 周前获得最后更新的 DATETIME 字段
【发布时间】:2018-10-30 20:05:40
【问题描述】:

这与我过去对 DATE 字段使用的查询相同,但是对于 DATETIME 字段它不起作用。

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

我想要 21 天前的日期,但可以是当天的任何时间。我不想要 21 天及以上(或 21 天及以下)。

【问题讨论】:

  • 您使用的 DBMS 是什么?请不要标记多个 DBMS。
  • 不用担心 Hana,通用 sql 标签稍后将被删除以防止这种情况发生。

标签: datetime mariadb


【解决方案1】:

您可以执行以下操作:

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获取

【讨论】:

  • @Hana 如果它解决了您的问题,请将此答案设置为已接受的答案。谢谢
【解决方案2】:

既然DATE(NOW())CURDATE()一样,你也可以用

WHERE log_updated >= CURDATE() - INTERVAL 21 DAY
  AND log_updated  < CURDATE() - INTERVAL 20 DAY

这可能使用log_updated 上的索引。

相比之下,DATE(log_updated) ...不能log_updated上使用索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2011-03-09
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多