How to get a list of months between two dates in mysql

后端 未结 3 2041
萌比男神i
萌比男神i 2020-11-30 06:00

I hve to get the list of months between two dates in mysql.

For Example:My Input is

 From date 23-01-2013
 To Date   01-04-2014

Output Should be 

Jan   20         


        
相关标签:
3条回答
  • 2020-11-30 06:32

    SQLFiddle demo

    select 
    DATE_FORMAT(m1, '%b %Y')
    
    from
    (
    select 
    ('2013-01-23' - INTERVAL DAYOFMONTH('2013-01-23')-1 DAY) 
    +INTERVAL m MONTH as m1
    from
    (
    select @rownum:=@rownum+1 as m from
    (select 1 union select 2 union select 3 union select 4) t1,
    (select 1 union select 2 union select 3 union select 4) t2,
    (select 1 union select 2 union select 3 union select 4) t3,
    (select 1 union select 2 union select 3 union select 4) t4,
    (select @rownum:=-1) t0
    ) d1
    ) d2 
    where m1<='2014-04-01'
    order by m1
    
    0 讨论(0)
  • 2020-11-30 06:36

    Try this one:

    select aDate from (
      select @maxDate - interval (a.a+(10*b.a)+(100*c.a)+(1000*d.a)) day 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, /*10 day range*/
      (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) b, /*100 day range*/
      (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) c, /*1000 day range*/
      (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) d, /*10000 day range*/
      (select @minDate := '2001-01-01', @maxDate := '2002-02-02') e
    ) f
    where aDate between @minDate and @maxDate
    
    0 讨论(0)
  • 2020-11-30 06:38

    this is a practical solution, it's not so 'elegant' if you wanna see it that way, but it works, and you can make it a function and/or a stored procedure, just with a couple of parameters...

    first, we need a table with some records, any table. we're gonna use this table, just as a row number table. (you'll need as many rows for the same amount of months you wanna display, having a large table is better) >>

    SELECT CONCAT(table_schema, '.', table_name) as schema_table, table_rows
    FROM   information_schema.TABLES
    order by 2 desc limit 0,100
    

    this will tell you, the top 100 tables with most records on your instance, i'm using the mysql.help table for this example, by default, this comes with some thousand records, and it's allways there...

    set @start_date = '2013-01-23';
    set @end_date = '2014-04-01';
    set @months = -1;
    
    select DATE_FORMAT(date_range,'%M, %Y') AS result_date from (
        select (date_add(@start_date, INTERVAL (@months := @months +1 ) month)) as date_range
        from mysql.help_topic a limit 0,1000) a
    where a.date_range between @start_date and last_day(@end_date);
    

    explained:

    1. set date variales 2. set month value, for adding months 3. select for each row, a date (we add a month and increment the month variable on the same row) 4. filter dates that are between range 5. output formated dates.

    this is the final output>>

    January, 2013
    February, 2013
    March, 2013
    April, 2013
    May, 2013
    June, 2013
    July, 2013
    August, 2013
    September, 2013
    October, 2013
    November, 2013
    December, 2013
    January, 2014
    February, 2014
    March, 2014
    April, 2014
    
    0 讨论(0)
提交回复
热议问题