在MySQL中比较日期的月份和年份

18

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

  • 开始日期
  • 结束日期

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

  • 需要获取所有以当前月份开始且结束日期可以是任何东西(例如currentDate+next30days)的事件。

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

有人能帮我指出如何做到这一点吗?

4个回答

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

2
总是忘记 CURDATE() 函数 :],所以加上 +1。 - BlitZ
我认为 now() 更容易记住。 - David Gras
2
@daVe:now 返回日期和时间。curdate 只返回日期。 - juergen d
@juergen:没错,但在这样的查询中你会得到类似的结果(注意比较!) - David Gras

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)

这仍然可以利用索引。


4

DateTime函数是你的好朋友:

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

1
感谢您提供快速解决方案 +1 - Umesh Awasthi

3

将年份和月份分开比较感觉有些混乱。我喜欢将它们合并在一行中。我怀疑这不会对性能产生明显的影响,所以这只是个人偏好。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接