我在MySQL数据库中有一些事件,我需要提取它们来提供日历。正常事件不是问题,但我有一些特殊事件可以每年重复。我的问题是如何提取这些事件。我试过这个来获取间隔[$ ini_month,$ ini_day] - [$ end_month,$ end_day]中的事件:
SELECT * FROM `events`
WHERE `repeat`='1' AND
MONTH(`date`) BETWEEN '$ini_month' AND '$end_month' AND
DAY(`date`) BETWEEN '$ini_day' AND '$end_day'
例如,如果我必须从7月1日到7月7日获得活动,$ ini_month = $ end_month = 7,$ ini_day = 1和$ end_day = 7。在这种情况下,此查询有效,但如果我必须从6月25日到7月7日获取事件,则会失败$ end_day< $ ini_day。那么,拜托,您能否帮我概括一下这个查询,使其能够对付任何输入?
答案 0 :(得分:0)
你必须特别对待“boder months”。
SELECT * FROM `events`
WHERE `repeat`='1' AND
MONTH(`date`) BETWEEN '$ini_month+1' AND '$end_month-1' OR
(MONTH(`date`) == $ini_month AND DAY(`date`) > '$ini_day') OR
(MONTH(`date`) == $end_month AND DAY(`date`) < '$end_day')
应该有效。但这非常难看。
相反,你可以做类似
的事情WHERE `repeat`='1' AND
MONTH(`date`) * 100 + DAY(`date`) BETWEEN $ini_month_day AND $end_month_day
如果您将$ini_month_day
和$end_month_day
设置为适当的值。
请注意,这也不是最佳选择,因为您不能以这种方式使用索引。
答案 1 :(得分:0)
将日期与日期进行比较会使一切变得简单:
SELECT * FROM `events`
WHERE `repeat`='1' AND
`date` BETWEEN '$start_date' AND '$end_date'
或许(如果你也有一个结束年......)
SELECT * FROM `events`
WHERE `repeat`='1' AND
`date` BETWEEN STR_TO_DATE(CONCAT($ini_day,'-','$ini_month','-','$ini_year'),'%d-%m-%Y')
AND STR_TO_DATE(CONCAT($end_day,'-','$end_month','-','$end_year'),'%d-%m-%Y')