【问题标题】:Selecting all rows from last month onward选择从上个月开始的所有行
【发布时间】:2014-02-14 22:37:08
【问题描述】:

我正在尝试选择从上个月到未来所有月份的所有数据..例如,我想选择数据库中从一月到未来任何可用日期的所有数据,这样就可以了对于任何月份.. 选择上个月直到今年的未来月份

这是我的查询,它只从 2 月开始,我怎样才能让它从上个月开始 .. 当前月份 - 1 不起作用

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
  AND MONTH(event_start_date) = MONTH(CURDATE())

【问题讨论】:

  • 你的意思是在开始日期和结束日期之间?
  • 为了获得最佳性能,我们更喜欢在 event_start_date 裸列上使用谓词;这将允许索引范围扫描(如果有适当的索引可用),而不是让 MySQL 评估表中的每一行。 “技巧”提出了一个使用当前日期时间并返回上个月第一天的表达式,例如event_start_date >= DATE_FORMAT(NOW()+INTERVAL -1 MONTH,'%Y-%m-01')

标签: mysql sql


【解决方案1】:

使用DATE_SUB() 选择上个月,使用>= 选择未来的所有数据:

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
  AND MONTH(event_start_date) >= MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH))

【讨论】:

    【解决方案2】:

    试试:

    AND MONTH(event_start_date) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS))
    

    DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 部分将从当前日期减去一个月。如果您想要上个月和未来的所有内容,请使用:

    AND MONTH(event_start_date) >= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS))
    

    注意'>='。尽管 1 月有一个极端情况,你必须绕过。最好的方法可能是这样的:

    WHERE event_start_date >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS), (DAYOFMONTH(CURDATE)) DAYS)
    

    从上个月 1 日起,您将获得一切。没有边缘情况。

    【讨论】:

    • 因为他只选择了一个特定的年份,所以极端情况不会成为问题。
    • 如果他想得到最后一个月,从去年开始,确实是一个重要的边缘案例。
    • 那么在这种情况下,YEAR(event_start_date) = YEAR(CURDATE()) 不允许他选择去年的任何内容。
    • DATE_SUB(CURDATE(), INTERVAL 1 MONTHS (DAYOFMONTH(CURDATE)-1) DAYS) 有语法错误。
    • 谢谢,我猜你不能使用两个间隔
    【解决方案3】:

    试试这个

    SELECT * 
    FROM events 
    WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
    AND MONTH(event_start_date) >= MONTH(CURDATE() - INTERVAL 1 MONTH);
    

    【讨论】:

      【解决方案4】:
      SELECT * 
      FROM events 
      WHERE event_start_date >= '1/'+MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH))+'/'+YEAR(DATE_SUB( CURDATE(), INTERVAL 1 MONTH))
      

      【讨论】:

        【解决方案5】:

        为了提高性能,您可能需要对event_start_date 列进行索引范围扫描操作。这意味着(显然),您需要一个以event_start_date 作为前导列的索引。

        要进行索引范围扫描,谓词需要在裸event_start_date 列上,而不是函数。

        WHERE event_start_date >= some_value
        

        对于这种情况下的“some_value”,您可以使用的一种可能的表达方式是:

        CAST(DATE_FORMAT(NOW()+INTERVAL -1 MONTH ,'%Y-%m-01') AS DATE)
        

        这需要当前日期和时间,减去一个月,然后将日期和时间部分设置为每月第一天的午夜。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-29
          • 1970-01-01
          • 2020-04-06
          • 1970-01-01
          • 2011-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多