按间隔获取日期范围

问题描述 投票:0回答:1

我需要根据日期,间隔和60天生成日期列表。这用于分区维护任务。就像一个例子:conf表看起来像:

schema tab  interval
--- --- ----
app tab1 daily
app tab2 monthly
app tab3 weekly

为简单起见,假设将其与information_schema一起使用会将每个最大分区日期赋予2020-05-17

select p.table_name, max(p.partition_description), max(pc. interval)
from INFORMATION_SCHEMA.partitions p
inner join conf pc
where  p.table_schema=pc.schema
  and p.partition_method='RANGE COLUMNS'
  and p.table_name=pc.tab
group by p.table_name;

result:
tab1 2020-05-18 daily
tab2 2020-06-01 monthly
tab3 2020-05-24 weekly

查询应返回制表符名称以及从最大日期开始到该间隔为止最多60天的所有日期。因此,结果应类似于:

tab  future_date
---  ---
tab2 2020-07-01
tab3 2020-05-31
tab3 2020-06-07
tab3 2020-06-14
tab3 2020-06-21
tab3 2020-06-28
tab3 2020-07-05
tab3 2020-07-12
tab1 2020-05-18
tab1 2020-05-19
tab1 2020-05-20
tab1 2020-05-21
..
tab1 2020-07-17

编辑

一个快速且肮脏的版本是在表的间隔和最大值上按最大值+ 1合并每个间隔的相同选择,然后循环直到没有更多行。但这很丑。

mysql sql select mysql-5.6
1个回答
0
投票

这并不理想,但这是bash函数,可动态创建查询并循环运行直到没有更多结果为止。

for INTERVAL in month week day ; do 
    NEW_PART="select concat('ALTER TABLE ',table_schema,'.',table_name,' ADD PARTITION (PARTITION p',replace(next_interval,'-',''), 
              ' VALUES LESS THAN (\'',next_interval,'\'));') 
            from (select p.table_schema,p.table_name, 
                  max(STR_TO_DATE(p.partition_description, '\'%Y-%m-%d\'')) + interval 1 ${INTERVAL} next_interval
    from INFORMATION_SCHEMA.partitions p
    inner join conf pc
    where  p.table_schema=pc.table_schema
      and p.partition_method='RANGE COLUMNS'
      and p.table_name=pc.table_name
      and lower(pc.partition_interval)='${INTERVAL}'
    group by p.table_name
    having max(STR_TO_DATE(p.partition_description, '\'%Y-%m-%d\'')) + interval 1 ${INTERVAL} < curdate() + interval 48 day) a"

    echo "${NEW_PART}" | ${MYSQL_CONN} > ${SCRIPT_SQL} 
    while [ `wc -l ${SCRIPT_SQL} | awk '{print $1}'` -gt 0 ]; do
            ${MYSQL_CONN} < ${SCRIPT_SQL} &>> ${SCRIPT_LOG}
            echo "${NEW_PART}" | ${MYSQL_CONN} > ${SCRIPT_SQL} 
    done
done
© www.soinside.com 2019 - 2024. All rights reserved.