我有一个表格,其中包含有关活动和节日的数据,以下列记录了他们的开始和结束日期。
日期格式位于YYYY-MM-DD
。我需要使用以下条件获取事件详细信息。
currentDate+next30days
。我很清楚结束日期的概念。但不确定如何获取其开始日期在当月的数据。
为此,我需要将当前年份和当前月份与我的数据库中的Start_Date
列进行比较。
任何人都可以帮我指出我是如何做到的吗?
答案 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')