我有一个包含活动和节日数据的表,以下列记录它们的开始和结束日期。
- 开始日期
- 结束日期
日期格式为YYYY-MM-DD
。 我需要根据以下条件获取事件详细信息。
- 需要获取所有以当前月份开始且结束日期可以是任何东西(例如
currentDate+next30days
)的事件。
我清楚结束日期的概念。 但不确定如何获取其开始日期在当前月份的数据。
为此,我需要将当前年份和月份与数据库中的开始日期
列进行比较。
有人能帮我指出如何做到这一点吗?
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)
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')
CURDATE()
函数:]
,所以加上 +1。 - BlitZnow()
更容易记住。 - David Grasnow
返回日期和时间。curdate
只返回日期。 - juergen d