创建一个年份查找表,如下所示,并根据您的数据(比如1980到2050)插入行:
CREATE TABLE IF NOT EXISTS `year_lookup` (
`year_value` int,
PRIMARY KEY (`year_value`)
) DEFAULT CHARSET=utf8;
INSERT INTO `year_lookup` (`year_value`) VALUES
('2010'),
('2011'),
('2012'),
('2013'),
('2014'),
('2015'),
('2016'),
('2017');
然后,使用年份查找来加入订阅表,以查找所有可能的周年纪念.最后,根据starts_at BETWEEN
和end_at NOT BETWEEN
过滤记录,如下所示.
-- Anniversary
SELECT DISTINCT Final.id FROM (
SELECT s.id AS id, DATE_ADD(MAKEDATE(y.year_value, 1), INTERVAL DAYOFYEAR(starts_at)-1 DAY) AS starts_at, ends_at
FROM subscriptions AS s
INNER JOIN year_lookup AS y
ON y.year_value BETWEEN YEAR(starts_at) AND YEAR(ends_at)
) AS Final
WHERE
((starts_at BETWEEN '2015-12-01' AND '2016-02-01')
AND (ends_at NOT BETWEEN '2015-12-01' AND '2016-02-01')) ;
请参阅此SQL Fiddle