2 つの日付間のすべての月の動的なテーブルを生成します
P粉663883862
2023-08-28 12:44:46
<p>次のようなテーブルがあります: </p>
<テーブルクラス="s-テーブル">
<頭>
<tr>
<th>名前</th>
<th>INT_VALUE</th>
<th>開始</th>
<th>END</th>
</tr>
</頭>
<みんな>
<tr>
<td>a</td>
100 |
2013-11-16 |
2014-11-16 |
</tr>
</tbody>
</テーブル>
<p>目標は以下を出力することです: </p>
<テーブルクラス="s-テーブル">
<頭>
<tr>
<th>名前</th>
<th>INT_VALUE</th>
<th>開始</th>
<th>END</th>
間隔 |
</tr>
</頭>
<みんな>
<tr>
<td>a</td>
100 |
2013-11-16 |
2014-11-16 |
2013 年 11 月 |
</tr>
<tr>
<td>a</td>
100 |
2013-11-16 |
2014-11-16 |
2013 年 12 月 |
</tr>
<tr>
<td>a</td>
100 |
2013-11-16 |
2014-11-16 |
2014 年 1 月 |
</tr>
<tr>
<td>a</td>
100 |
2013-11-16 |
2014-11-16 |
2014 年 2 月 |
</tr>
</tbody>
</テーブル>
<p>これを使い始めました。しかし、テーブル内の開始日と終了日を使用して、計算間の月のリストの開始日と終了日を決定する方法がわかりません。 </p>
<pre class="brush:php;toolbar:false;">SELECT START、カレンダー、COUNT(1)
FROM テーブル 1 AS t1
RIGHT JOIN (SELECT row_number() OVER (ORDER BY SEQ4()) AS MONTHS
, TO_DATE(DATEADD(MONTH, MONTHS, '2019-05-01')) AS カレンダー
FROM TABLE(GENERATOR(rowcount=>80)))
ON t1.START = カレンダー
1、2でグループ化
2、1までにご注文ください
;</pre>
<p>ここでの目標は、範囲の開始と終了の間の各月に int 値を関連付けることです。 </p>
数値範囲
を独自の CTE に移動して分離しました。これで、80 個の数値 (おそらくこれよりも大きい) の大きなリストができました。次に、開始/終了間の月数を見つけて、同じ数の行を連結します。次に、計算を行って範囲を選択範囲に変換します。 リーリー
別のオプションは、長期にわたる日付テーブルを作成することですリーリー
次に、BETWEEN を使用して (開始、終了) 範囲に含まれる値を取得します。これは次のようになります。 リーリー
リーリー
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=bdd028a7755fdcb8296df2301baeb295
月の先頭にゼロを付けたくない場合は、
'%c-%Y'
パターンを使用します。