Generate dynamic table of all months between two dates
P粉663883862
2023-08-28 12:44:46
<p>I have a table that looks like this: </p>
<table class="s-table">
<thead>
<tr>
<th>Name</th>
<th>INT_VALUE</th>
<th>Start</th>
<th>END</th>
</tr>
</thead>
<tbody>
<tr>
<td>a</td>
<td>100</td>
<td>2013-11-16</td>
<td>2014-11-16</td>
</tr>
</tbody>
</table>
<p>The goal is to output the following: </p>
<table class="s-table">
<thead>
<tr>
<th>Name</th>
<th>INT_VALUE</th>
<th>Start</th>
<th>END</th>
<th>interval</th>
</tr>
</thead>
<tbody>
<tr>
<td>a</td>
<td>100</td>
<td>2013-11-16</td>
<td>2014-11-16</td>
<td>11-2013</td>
</tr>
<tr>
<td>a</td>
<td>100</td>
<td>2013-11-16</td>
<td>2014-11-16</td>
<td>December 2013</td>
</tr>
<tr>
<td>a</td>
<td>100</td>
<td>2013-11-16</td>
<td>2014-11-16</td>
<td>1-2014</td>
</tr>
<tr>
<td>a</td>
<td>100</td>
<td>2013-11-16</td>
<td>2014-11-16</td>
<td>February 2014</td>
</tr>
</tbody>
</table>
<p>I've started using this. But I'm not sure how to use the START and END dates in the table to determine the start and end of the list of months between calculations. </p>
<pre class="brush:php;toolbar:false;">SELECT START, calendar, COUNT(1)
FROM table1 AS t1
RIGHT JOIN (SELECT row_number() OVER (ORDER BY SEQ4()) AS MONTHS
, TO_DATE(DATEADD(MONTH, MONTHS, '2019-05-01')) AS calendar
FROM TABLE(GENERATOR(rowcount=>80)))
ON t1.START = calendar
GROUP BY 1, 2
ORDER BY 2, 1
;</pre>
<p>The goal here is to associate an int value with each month between the start and end of the range. </p>
Moved the
number range
into its own CTE to separate things, we now have a large list of 80 numbers (probably larger).Then we find the number of months between start/end and concatenate the same number of rows. Then do the math to convert the range into a selection:
Another option is to build a long range date table
Then we use BETWEEN to get the included values in the (start, end) range, which becomes:
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=bdd028a7755fdcb8296df2301baeb295
If you don't want the month to have leading zeros, use the
'%c-%Y'
pattern.