【问题标题】:MySQL Query to get all rows for 2 months agoMySQL 查询获取 2 个月前的所有行
【发布时间】:2023-04-01 02:55:01
【问题描述】:

我需要进行选择,我可以选择查看本月、上个月、1 个月前、2 个月前、3 个月前的结果。

我发现了这个问题:MySQL: Query to get all rows from previous month,但我遇到了一个过滤器,它可以让我得到 2 个月前从该月的第一天到最后一天的所有结果。

我试过了,但它不起作用:

SELECT * FROM table
AND MONTH(date_created) = MONTH(1 MONTH - INTERVAL 2 MONTH);

【问题讨论】:

  • 如果日期使用date 数据类型存储,那么您可以使用select * from table where date_created < date_sub(curdate(), interval 2 month); 如果日期存储为datetime 或时间戳,则使用now() 而不是curdate()

标签: mysql sql


【解决方案1】:

试试这个:

SELECT * FROM table
WHERE MONTH(date_created) = MONTH(NOW() - INTERVAL 2 MONTH)
    AND (
          YEAR(date_created) = YEAR(NOW()) 
        OR 
          YEAR(date_created) = YEAR(NOW() - INTERVAL 2 MONTH)
    );

仅在 MySQL 中返回过去 2 个月之前创建的记录。

【讨论】:

  • 此解决方案可能会从任何年中选择与指定月份匹配的所有匹配行。 stackoverflow.com/a/2090235/24378这个答案也会根据年份进行过滤。
  • 是的,添加了当前年份的检查,所以它返回仅最近 2 个月返回数据
  • 我猜 AND YEAR(InsertedDate) 应该是 AND YEAR(date_created)
  • 是的,伙计,我正在检查我的数据库.. 所以保持原样!现已更正! (っ^▿^)
  • 新年查询不起作用我想它应该在 AND YEAR(date_created) = YEAR(NOW() - INTERVAL 2 MONTH) 中修复
【解决方案2】:

如果您想要 2 个月前的所有行,请使用如下逻辑:

WHERE date_created >= DATE_SUB(DATE_SUB(CURDATE(), 1 - DAY(CURDATE())), INTERVAL 2 MONTH) AND
      date_created < DATE_SUB(DATE_SUB(CURDATE(), 1 - DAY(CURDATE())), INTERVAL 1 MONTH)

这是在做什么?首先,它只是将函数应用于表达式的当前日期部分。这允许 MySQL 使用date_created 上的索引(如果可用且适当)。

表达式DATE_SUB(CURDATE(), 1 - DAY(CURDATE()) 只是获取当月第一天的一种方式。

【讨论】:

    【解决方案3】:

    您的查询有误,正确的是:

    SELECT * FROM table
    WHERE MONTH(date_created) = MONTH(DATE_SUB(NOW(),INTERVAL 2 MONTH))
    

    对于当前月份只需 MONTH(NOW()),将“2”替换为您需要的任意月份数 (1,3,.. 23)

    如 cmets 中所述,此解决方案忽略 YEAR 差异,它只选择同一月份的所有记录,无论年份如何

    您可以使用附加子句过滤错误的年份结果:

     AND YEAR(date_created) = '2019' # or year you need
    

    或者使用更复杂的查询:

    SELECT * FROM table
    where
    date_created between
    /* first day of -2 month*/
    date_sub(date_sub(now(),interval 2 month), interval (day(now())-1) day) 
    and
    /* last day of -2 month*/
    last_day(date_sub(now(),interval 2 month))
    

    【讨论】:

    • 请不要发布裸代码,同时解释代码的作用。
    • 这个答案展示了如何使用过滤器,但没有回答问题
    • @fremail,问题是如何找到2个月前的结果(根据标题),认为我的答案足够干净,提供了解释,你认为它仍然没有回答问题吗?跨度>
    • @2oppin,现在好多了。但要 100% 确定它也需要检查年份 ;-)
    • @fremail,现在开心吗?)
    猜你喜欢
    • 2011-01-06
    • 2021-11-28
    • 2014-12-30
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多