我有一个包含折扣的MySQL数据库。简化版本如下所示:
id | start (UNIX timestamp) | end (UNIX timestamp)
45 | 1384693200 | 1398992400
68 | 1386018000 | 1386277200
263 | 1388530800 | 1391209200
折扣可以持续几天,几个月,甚至几年。我正在寻找一种方法来选择一个独特的月份列表,其中(未来)折扣有效。
如果有:
输出应为:
- December (2013)
- January (2014)
- February (2014)
- March (2014)
- April (2014)
- June (2014)
2013年11月未显示,因为它已过去。 2014年5月未显示,因为该月没有折扣。
有人可以帮忙吗?
提前致谢!
答案 0 :(得分:1)
创建一个表格,其中包含从0到您可能需要的月份的数字序列,并将此表格连接到您的表格。
这是如何为每个id
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 ;
演示 - &gt; http://www.sqlfiddle.com/#!9/d7cfc/4
如果您希望将所有id
的年份+月份合并,请跳过id
列并使用GROUP BY
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
以过滤掉不需要的过去行。