在mysql中按月和年比较日期

时间:2013-10-06 06:47:40

标签: mysql sql

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

  • START_DATE
  • END_DATE

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

  • 需要获取以当前月份开头的所有事件,结束日期可以是currentDate+next30days

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

任何人都可以帮我指出我是如何做到的吗?

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分: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)

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

这仍然可以利用索引。

答案 2 :(得分:4)

DateTime functions是你的朋友:

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

答案 3 :(得分:0)

分别比较年和月会感到混乱。我喜欢将其包含在一行中。我怀疑这会对性能产生明显的影响,因此纯粹出于个人喜好。

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')