產生兩個日期之間的所有月份的動態表格
P粉663883862
P粉663883862 2023-08-28 12:44:46
0
2
569
<p>我有一個如下所示的表格:</p> <table class="s-table"> <thead> <tr> <th>姓名</th> <th>INT_VALUE</th> <th>開始</th> <th>END</th> </tr> </thead> <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"> <thead> <tr> <th>姓名</th> <th>INT_VALUE</th> <th>開始</th> <th>END</th> <th>間隔</th> </tr> </thead> <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日期來確定計算之間的月份清單的開始和結束。 </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>這裡的目標是將int值與範圍開始到結束之間的每個月份關聯起來。 </p>
P粉663883862
P粉663883862

全部回覆(2)
P粉924915787

數字範圍移至自己的CTE中以分離事物,我們現在有一個包含80個數字的大列表(可能更大)。

然後我們找到開始/結束之間的月數,並連接相同數量的行。然後進行數學計算,將範圍轉換為選擇部分:

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;

另一個選擇是建立一個長時間範圍的日期表

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))

然後我們使用BETWEEN來取得(開始,結束)範圍內的包含值,變成:

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

如果您不需要月份前導零,請使用'%c-%Y'模式。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板