MySQL:在两个给定日期之间获取项目

时间:2011-09-12 09:18:46

标签: mysql

我在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。那么,拜托,您能否帮我概括一下这个查询,使其能够对付任何输入?

2 个答案:

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