我有一个表格,其中包含有关事件和节日的数据,以下列记录它们的开始和结束日期。
- 开始日期
- 结束日期
日期格式为YYYY-MM-DD
. 我需要使用以下条件获取事件详细信息。
- 需要获取从当前月份开始的所有事件,并且可以说结束日期
currentDate+next30days
。
我很清楚结束日期的概念。但不确定如何获取开始日期在当前月份的数据。为此,我需要将当前年份和当前月份与Start_Date
数据库中的列进行比较。
谁能帮我指出我该怎么做?
select * from your_table
where year(Start_Date) = year(curdate())
and month(Start_Date) = month(curdate())
and end_date <= curdate() + interval 30 day
我不喜欢其他两个答案中的任何一个,因为它们不允许优化器在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)
这仍然可以利用索引。
DateTime
函数是你的朋友:
SELECT
*
FROM
`event`
WHERE
(MONTH(NOW()) = MONTH(`Start_Date`))
AND
(`End_Date` <= (NOW() + INTERVAL 30 DAY))
AND
(YEAR(NOW()) = YEAR(`Start_Date`))
分别比较年份和月份感觉很混乱。我喜欢将它包含在一行中。我怀疑它会对性能产生显着影响,所以这纯粹是个人喜好。
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')