Rumah  >  Soal Jawab  >  teks badan

Hasilkan jadual dinamik semua bulan antara dua tarikh

<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粉663883862P粉663883862419 hari yang lalu532

membalas semua(2)saya akan balas

  • P粉924915787

    P粉9249157872023-08-29 11:21:21

    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

    balas
    0
  • P粉567112391

    P粉5671123912023-08-29 00:50:09

    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'.

    balas
    0
  • Batalbalas