【问题标题】:MySQL Query to calculate the Previous MonthMySQL 查询计算上个月
【发布时间】:2009-07-16 14:52:56
【问题描述】:

我想计算上个月的总订单金额。

我得到了从当前日期获取当前月份数据的查询。

SELECT SUM(goods_total) AS Total_Amount  FROM orders
WHERE order_placed_date >= date_sub(current_date, INTERVAL 1 MONTH);

现在我如何才能只获取上个月的数据,不包括本月。

例如这个月(七月)我赚了 15,000 美元,上个月(六月)我赚了 14,000 美元。

我通过运行上述查询获得了 15,000 美元。

但我不知道如何计算前几个月。

【问题讨论】:

  • "WHERE AND" - 取出 AND。
  • 感谢指出,我不小心把它放在那里了。

标签: mysql


【解决方案1】:

在这里,用它来获取 MySQL 中上个月 1 日和上个月最后一天之间的日期:

... order_placed_date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')
AND DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')

【讨论】:

  • 不客气。几个月前我遇到了同样的问题并想出了这个问题。
  • 我使用 current_date 而不是 NOW()
  • NOW() 与 CURRENT_TIMESTAMP 相同,这里实际上与 CURRENT_DATE 相同。
  • 这个查询实际上会忽略该月的最后一天,因为它将间隔的结束点设置为最后一天的 00:00:00。
  • @JL 修复了查询,谢谢。我实际上在几年前就注意到了,并在我的本地查询中修复了它,但忘记了这个答案。
【解决方案2】:

我发现 Artem 的查询没有返回上个月最后一天的任何内容(大概是因为 BETWEEN 会从最后一天的 00:00:00 开始计算)。

这似乎对我上个月有用。

order_placed_date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01')
AND DATE_FORMAT(NOW() ,'%Y-%m-01')

【讨论】:

  • 我已更新我的查询以正常工作,与您的略有不同。
【解决方案3】:

最简单的解决方案:

SELECT SUM(goods_total) AS Total_Amount FROM orders
WHERE YEAR(order_placed_date) = YEAR(CURDATE() - INTERVAL 1 MONTH)
AND MONTH(order_placed_date) = MONTH(CURDATE() - INTERVAL 1 MONTH)

【讨论】:

    【解决方案4】:

    这里是另一个解决方案 - 没有字符串操作

    SELECT SUM(goods_total) AS Total_Amount  FROM orders
    WHERE  DATE(order_placed_date) 
    BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
    AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH));
    

    【讨论】:

      【解决方案5】:

      如果你很懒,用起来还挺方便的

      ...date_format(order_placed_date, '%Y-%m') = date_format(now() - INTERVAL 1 MONTH, '%Y-%m')

      我认为它也增加了可读性。

      【讨论】:

      • 您的查询的问题在于它会进行全表扫描,并且在大型数据集上的性能很差,因为它不会使用索引。我发布的 BETWEEN 查询使用了一个范围,因此它可以使用索引。可读性......我认为两者都是可读的:)
      • 哦,仅供参考,MySQL 不支持基于函数的索引。 PostgreSQL 应该可以。
      • 抱歉,我现在看到了。我只是习惯于从多达几百条记录的表中执行此操作。谢谢。
      【解决方案6】:

      这是我发现的另一种方法:

      SELECT SUM(goods_total) AS Total_Amount  FROM orders
      WHERE SUBSTRING(o.order_placed_date FROM 1 FOR 7) =   SUBSTRING(CURRENT_DATE - INTERVAL 1 MONTH FROM 1 FOR 7) 
      

      这也有效。

      【讨论】:

      • 我想和上面一样的问题。通过 EXPLAIN 运行所有 SELECT(只需在每个 SELECT 前面加上 EXPLAIN),然后查看 EXPLAIN 为您提供的有关每个查询效率的信息。
      • 也就是说,假设您在 order_placed_date 创建了一个索引。你做到了,对吧?对吗?
      • 在索引下,order_placed_date 设置为:Non_Unique = 1, Seq_in_Index = 1, IndexType= BTREE
      猜你喜欢
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多