15

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

  • 开始日期
  • 结束日期

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

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

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

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

4

4 回答 4

26
select * from your_table
where year(Start_Date) = year(curdate())
and month(Start_Date) = month(curdate())
and end_date <= curdate() + interval 30 day
于 2013-10-06T06:52:06.353 回答
5

我不喜欢其他两个答案中的任何一个,因为它们不允许优化器在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)

所有日期函数都是 on 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)

这仍然可以利用索引。

于 2017-01-28T14:44:22.153 回答
4

DateTime函数是你的朋友:

SELECT
    *
FROM
    `event`
WHERE
    (MONTH(NOW()) = MONTH(`Start_Date`))
    AND
    (`End_Date` <= (NOW() + INTERVAL 30 DAY))
    AND
    (YEAR(NOW()) = YEAR(`Start_Date`))
于 2013-10-06T06:51:55.223 回答
2

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

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')
于 2018-11-28T07:43:46.153 回答