Hasilkan jadual dinamik semua bulan antara dua tarikh
P粉663883862
P粉663883862 2023-08-28 12:44:46
0
2
572
<p>我有一个如下所示的表:</p> <table class="s-table"> <kepala> <tr> <th>姓名</th> <th>INT_VALUE</th> <th>开始</th> <th>END</th> </tr> </kepala> <tbody> <tr> <td>一个</td> <td>100</td> <td>2013-11-16</td> <td>2014-11-16</td> </tr> </tbody> </table> <p>目标是输出如下:</p> <table class="s-table"> <kepala> <tr> <th>姓名</th> <th>INT_VALUE</th> <th>开始</th> <th>END</th> <th>间隔</th> </tr> </kepala> <tbody> <tr> <td>一个</td> <td>100</td> <td>2013-11-16</td> <td>2014-11-16</td> <td>11-2013</td> </tr> <tr> <td>一个</td> <td>100</td> <td>2013-11-16</td> <td>2014-11-16</td> <td>2013年12月</td> </tr> <tr> <td>一个</td> <td>100</td> <td>2013-11-16</td> <td>2014-11-16</td> <td>1-2014</td> </tr> <tr> <td>一个</td> <td>100</td> <td>2013-11-16</td> <td>2014-11-16</td> <td>2014年2月</td> </tr> </tbody> </table> <p>我已经开始使用这个。但是我不确定如何使用表中的START和END日期来确定是我不确定如何使用表中的START和END日期来确定乡计算的始和结束。</p> <pre class="brush:php;toolbar:false;">PILIH MULA, kalendar, COUNT(1) DARI jadual1 AS t1 KANAN SERTAI (PILIH row_number() OVER (ORDER BY SEQ4()) SEBAGAI BULAN , TO_DATE(DATEADD(BULAN, BULAN, '2019-05-01')) SEBAGAI kalendar DARI JADUAL(PENJANA(bilangan baris=>80))) HIDUP t1.MULA = kalendar KUMPULAN OLEH 1, 2 PESANAN OLEH 2, 1 ;</pra> <p>这里的目标是将int值与范围开始到结束之间的每个月份关联起来。</p>
P粉663883862
P粉663883862

membalas semua(2)
P粉924915787

Berpindah 数字范围 ke dalam CTE sendiri untuk memisahkan perkara, kami kini mempunyai senarai besar 80 nombor (mungkin lebih besar).

Kemudian kami mencari bilangan bulan antara mula/akhir dan menyertai bilangan baris yang sama. Kemudian lakukan matematik untuk menukar julat kepada pilihan:

WITH range_of_numbers AS (
    SELECT 
        row_number() OVER (ORDER BY SEQ4())-1 AS rn
    FROM TABLE(GENERATOR(rowcount=>80))
)
SELECT 
    t1.name, 
    t1.int_value, 
    t1.start,
    t1.end,
    DATEADD(MONTH, r.rn, t1.start) as interval
FROM table1 AS t1
JOIN range_of_numbers as r
    ON date_diff('month', t1.START, t1.end) <= between r.rn
ORDER BY 2,1,3;

Pilihan lain ialah membina jadual tarikh jarak jauh

CREATE TABLE dates AS 
SELECT 
     DATEADD(MONTH, row_number() OVER (ORDER BY SEQ4())-1, '1980-01-01') as month_date
FROM TABLE(GENERATOR(rowcount=>8000))

Kemudian kami menggunakan ANTARA untuk mendapatkan nilai yang disertakan dalam julat (mula, tamat), yang menjadi:

FROM table1 AS t1
JOIN dates as d
    ON d.month_date BETWEEN t1.START AND t1.end
P粉567112391
WITH RECURSIVE
cte AS ( SELECT name, int_value, start, `end`, 
                1 rownum, DATE_FORMAT(start, '%m-%Y') `interval`
         FROM source_table
         UNION ALL
         SELECT name, int_value, start, `end`, 
                1 + rownum, DATE_FORMAT(start + INTERVAL rownum MONTH, '%m-%Y')
         FROM cte
         WHERE start + INTERVAL rownum - 1 MONTH < `end` )
         
SELECT name, int_value, start, `end`, `interval`
FROM cte
ORDER BY rownum;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=bdd028a7755fdcb8296df2301baeb295

Jika anda tidak mahu bulan itu mempunyai sifar pendahuluan, gunakan corak '%c-%Y'.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan