【问题标题】:comparing dates by month and year in mysql在mysql中按月和年比较日期
【发布时间】:2013-10-06 06:47:40
【问题描述】:

我有一个表格,其中包含有关事件和节日的数据,以下列记录它们的开始和结束日期。

  • 开始日期
  • 结束日期

日期格式为YYYY-MM-DD。我需要获取具有以下条件的事件详细信息。

  • 需要获取从当前月份开始并且结束日期可以是 currentDate+next30days 的所有事件。

我很清楚结束日期的概念。但不确定如何获取开始日期在当前月份的数据。 为此,我需要将当前年份和当前月份与数据库中的 Start_Date 列进行比较。

谁能帮我指出我该怎么做?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    select * from your_table
    where year(Start_Date) = year(curdate())
    and month(Start_Date) = month(curdate())
    and end_date <= curdate() + interval 30 day
    

    【讨论】:

    • 总是忘记CURDATE()函数:],所以+1
    • 我觉得now()更容易记住。
    • @daVe: now 返回日期和时间。 curdate 只有日期。
    • @juergen:没错,但你会在这样的查询中得到类似的结果(注意比较!)
    【解决方案2】:

    我不喜欢其他两个答案中的任何一个,因为它们不允许优化器使用start_date 上的索引。为此,函数需要位于当前日期。

    所以,我会选择:

    where start_date >= date_add(curdate(), interval 1 - day(curdate()) day) and
          start_date < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 1 month)
    

    所有的日期函数都在curdate()上,在这种情况下不影响MySQL使用索引的能力。

    您还可以在end_date 上包含条件:

    where (start_date >= date_add(curdate(), interval 1 - day(curdate()) day) and
           start_date < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 1 month)
          ) and
          end_date <= date_add(curdate(), interval 30 day)
    

    这仍然可以利用索引。

    【讨论】:

      【解决方案3】:

      DateTime functions是你的朋友:

      SELECT
          *
      FROM
          `event`
      WHERE
          (MONTH(NOW()) = MONTH(`Start_Date`))
          AND
          (`End_Date` <= (NOW() + INTERVAL 30 DAY))
          AND
          (YEAR(NOW()) = YEAR(`Start_Date`))
      

      【讨论】:

      • 感谢您提供快速解决方案 +1
      【解决方案4】:

      单独比较年份和月份感觉很混乱。我喜欢将它包含在一行中。我怀疑它会在性能上产生显着差异,所以这纯粹是个人喜好。

      select * from your_table
      where LAST_DAY(Start_Date) = LAST_DAY(curdate())
      and end_date <= curdate() + interval 30 day
      

      所以我所做的就是使用 last_day 函数来检查每个日期当月的最后一天,然后比较这个公分母。你也可以使用

      where DATE_FORMAT(Start_Date ,'%Y-%m-01') = DATE_FORMAT(curdate(),'%Y-%m-01')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 2018-02-17
        • 2012-10-10
        相关资源
        最近更新 更多