今天工作过程中,遇到了一个需要生成一个日期序列作为主表的需求。
方法一
以前的做法是通过借助于辅助表来实现,意思是说,生成一个整数序列1~N(N至少要大于所需序列的最大长度),并在数据库中创建这个表。然后结合DATE_ADD函数来实现就行。步骤如下:
- 创建一个表T_INT,创建一列INT_FIELD,数据类型为INT,存入数据0~10000,这里假设我们需要的序列长度不会超过10000.
- 然后,编写SQL,就可以获得时间序列。SQL如下:
SELECT DATE_ADD('2023-02-05', INTERVAL INT_FIELD DAY)FROM T_INT WHERE DATE_ADD('2023-02-05', INTERVAL INT_FIELD DAY)<='2023-03-02'
这样,我们就获得了从2023年2月5日到2023年3月2日的一个时间序列。
方法二
今天刚刚学习了一种新的方式,借助于MYSQL8的递归函数,不用建立物理表就可以实现。SQL如下
WITH RECURSIVE DATE_LIST (DATES) AS ( SELECT DATE('2023-02-05') AS DATES UNION ALL SELECT DATE_ADD(DATES, INTERVAL 1 DAY) FROM DATE_LIST WHERE DATE_ADD(DATES, INTERVAL 1 DAY) < '2023-03-02' ) SELECT DATES FROM DATE_LIST
在RECURSIVE定义的递归下,UNION ALL前面的部分相当于初始化递归函数。UNIONALL后面的部分实现递归调用,直到达到WHERE后的终止条件。
来源地址:https://blog.csdn.net/hpuexplorer/article/details/130250734