当折扣有效时,MySQL选择独特的月份

时间:2013-12-18 16:37:35

标签: mysql sql

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

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月开始并于同月结束的折扣

输出应为:

- December (2013)  
- January (2014)  
- February (2014)  
- March (2014)  
- April (2014)  
- June (2014)

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

有人可以帮忙吗?

提前致谢!

1 个答案:

答案 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以过滤掉不需要的过去行。