关于sql:当折扣有效时,MySQL选择独特的月份

MySQL select unique months when discounts are valid

我有一个包含折扣的MySQL数据库。 简化版本如下所示:

1
2
3
4
id  | start (UNIX timestamp) | end (UNIX timestamp)
45  | 1384693200             | 1398992400  
68  | 1386018000             | 1386277200  
263 | 1388530800             | 1391209200

折扣可以持续几天,几个月,甚至几年。 我正在寻找一种方法来选择一个独特的月份列表,其中(未来)折扣有效。

如果有:

  • 折扣始于2013年11月,并于2014年4月结束
  • 折扣从2013年12月开始,在同一个月结束
  • 折扣从2014年1月开始,一个月后结束
  • 折扣从2014年6月开始,到同月结束

输出应该是:

1
2
3
4
5
6
- December (2013)  
- January (2014)  
- February (2014)  
- March (2014)  
- April (2014)  
- June (2014)

2013年11月未显示,因为它已过去。 2014年5月未显示,因为该月没有折扣。

有人可以帮忙吗?

提前致谢!


创建一个表,其中包含从0到您可能需要的月份的数字序列,并将此表连接到您的表。
这是如何为每个id分别获取年份+月份列表的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT id,
       year( start + interval x month ) year,
       month( start + interval x month ) month
FROM
numbers n
JOIN
(
     SELECT id,
            from_unixtime( start ) start,
            from_unixtime( end ) end
     FROM Table1
) q
ON n.x <= period_diff( date_format( q.end, '%Y%m' ),date_format( q.start, '%Y%m' ))
ORDER BY id, year, month ;

演示 - > http://www.sqlfiddle.com/#!9/d7cfc/4

如果要为所有id组合年份+月份,请跳过id列并使用GROUP BY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT year( start + interval x month ) year,
       month( start + interval x month ) month
FROM
numbers n
JOIN
(
     SELECT id,
            from_unixtime( start ) start,
            from_unixtime( end ) end
     FROM Table1
) q
ON n.x <= period_diff( date_format( q.end, '%Y%m' ),date_format( q.start, '%Y%m' ))
GROUP BY year, month
ORDER BY year, month ;

如果你想跳过过去几年和几个月,添加WHERE year >= current year AND month >= current month,这是一个微不足道的变化。 还要在子查询中添加另一个WHERE end < current-unix-time以过滤掉不需要的过去行。