MYSQL从开始/结束日期

时间:2016-05-09 05:52:39

标签: mysql date select group-concat

合同表中有两个主要字段Startdate和Enddate我想将结果作为名为description的额外列来表示合同开始和结束之间的月份。见下表和我需要的结果

Table : Contracts
------------------------------
ID | START      | END        |
------------------------------
1  | 2016-05-01 | 2016-07-31 |
2  | 2016-04-01 | 2016-08-31 |
3  | 2016-01-22 | 2016-02-25 |
------------------------------

这里我需要按照下面的结果,一个额外的字段,表示使用SELECT查询的合同的开始日期和结束日期之间的月份/列表。

Result (as per give format)
----------------------------------------------------------------------------------------
ID | START      | END        | Description      
----------------------------------------------------------------------------------------
1  | 2016-05-01 | 2016-07-31 | May-2016, Jun-2016, July-2016
2  | 2016-04-01 | 2016-07-31 | April-2016, May-2016, Jun-2016, July-2016
3  | 2016-01-22 | 2016-02-25 | January-2016, February-2016
----------------------------------------------------------------------------------------

上表startdate的第一行示例是2016-05-01(2016-May-01),结束日期是2016-07-31(2016-July-31)所以这里给出了五月之间的月份和年份列表-01至7月31日,因此描述将于2016年5月,2016年6月,2016年7月。

我尝试了很多查询仍然无法获得确切的SQL查询。

不知道如何做到并得到相同的结果,

请提出任何建议

先谢谢

1 个答案:

答案 0 :(得分:1)

以下查询应该可以解决问题。

第二行的输入和输出数据不同,我已经为输出数据运行了

select id, DATE_FORMAT(start_Date, '%Y-%c-%d') as Start_Date,
       DATE_FORMAT(end_date,'%Y-%c-%d') as END_Date,
       group_concat( distinct(DATE_FORMAT(aDate, '%Y %M '))) as Descp
from (
     select ss.end_date - interval (a.a ) month as aDate from
     (select 0 as a union all select 1 union all select 2 union all select 3
     union all select 4 union all select 5 union all select 6 union all
     select 7 union all select 8 union all select 9) a, Contracts ss 
     ) mon, Contracts sa
where aDate between sa.start_date and sa.end_date
group by id;