我将重复活动存储在事件表中,该事件表发生在一年中的某些月份,任何年份和每年。例如;
CREATE TABLE events (
event_id tinyint(3) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
month_from tinyint(3) unsigned NOT NULL,
month_to tinyint(3) unsigned NOT NULL,
PRIMARY KEY (event_id) )
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3;
INSERT INTO events
(event_id, name, month_from, month_to)
VALUES
(1, 'Event ABC', 5, 11), (2, 'Event XYZ', 12, 4);
活动ABC - 每年5月至11月举行 活动XYZ - 每年12月至4月举行
在我的事件表中,我将month_from
和month_to
存储为数值。
我想要做的是说当前月份(10月)并将其传递给sql查询,以便它返回给我正确的事件“事件ABC”。但是我也想把它传递给未来一个月,比如2月它应该回到我的“事件XYZ”
我希望这有道理吗?
答案 0 :(得分:1)
尝试:
FROM TABLE t
WHERE @month BETWEEN t.month_from AND t.month_to
如果你想传递日期&从比较日期开始计算月份:
FROM TABLE t
WHERE MONTH(@your_date) BETWEEN t.month_from AND t.month_to
参考:MONTH
答案 1 :(得分:1)
select * from tbl
where (month_from <= $YOUR_MONTH and month_to >= $YOUR_MONTH) or
(month_from > month_to and (month_to >= $YOUR_MONTH or month_from <= $YOUR_MONTH)
这也适用于DEC-APR范围
答案 2 :(得分:0)
select * from tbl
where month_from <= <YOUR_MONTH> and month_to >= <YOUR_MONTH>
假设<YOUR_MONTH>
是一个在语义上等同于month_from和month_to字段的值。
更新:刚刚注意到12月到4月的第二个例子。也许你可以为12月到12月和1月到4月的事件创建两个范围。
答案 3 :(得分:0)
这应该这样做:
SELECT * FROM events WHERE month_from <= $your_month AND month_to >= $your_month
您不限于整数月份。您可以将DATE数据类型与MySQL(或数据库的等效项)一起使用,并使用与上面相同的查询。您的数据库将“理解”DATE字段的&lt;,&gt;,=运算符。