如何在Bash中存储多组日期并合并为单一变量(含空值处理)
Bash日期变量拼接与合并解决方案
一、A部分:获取并处理增量日期变量
通过psql获取start_dt_incr和end_dt,同时处理空值或无效值的情况:
# 获取start_dt_incr,处理空值,默认返回1900-01-02 start_dt_incr=$(psql -q -A -t -c "select cast(coalesce(max(date_key),'1900-01-01')+ interval '1 day' as varchar(10)) from target_table;" -d ${database_name} | xargs) # 获取end_dt,处理空值(若为空则设为空字符串) end_dt=$(psql -q -A -t -c "select process_dt from process_table;" -d ${database_name} | xargs) # 验证日期有效性,仅当两个变量均为有效日期格式时生成增量区间行 incr_line="" if [[ $start_dt_incr =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ && $end_dt =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then incr_line="${start_dt_incr}|${end_dt}" fi
注:xargs用于去除psql输出中的多余空格和换行,正则判断确保日期格式合法。
二、B部分:批量获取历史日期区间
你提供的命令可以将SQL查询结果存储到start_end_dt_hist变量,但需注意保留换行符,避免多行结果被合并为单行。修改后的命令如下:
# 用双引号包裹命令替换,保留查询结果的换行结构 start_end_dt_hist="$(psql -q -A -t -c " SELECT concat(cast(MIN(g.dt)::date as CHAR(10)), '|',cast(MAX(g.dt)::date as CHAR(10))) FROM generate_series(date '2019-06-25', '2024-01-15', '1 day') g(dt) GROUP BY EXTRACT(YEAR FROM g.dt) ORDER BY MIN(g.dt)::date; " -d ${database_name} | xargs -L1)"
xargs -L1用于确保每行内容被正确保留,避免多余空格干扰。
三、C部分:合并所有日期区间到all_dt
将A部分的增量区间和B部分的历史区间合并,同时处理空值情况(若某部分无有效内容则跳过):
# 初始化all_dt all_dt="" # 添加增量区间行(若有效) if [[ -n $incr_line ]]; then all_dt="${incr_line}" fi # 添加历史区间内容(若有效) if [[ -n $start_end_dt_hist ]]; then if [[ -n $all_dt ]]; then # 已有内容则添加换行分隔 all_dt="${all_dt}"$'\n'"${start_end_dt_hist}" else all_dt="${start_end_dt_hist}" fi fi # 输出验证(可选) echo "all_dt=" echo "${all_dt}"
执行后all_dt的格式将符合需求,示例输出:
all_dt= 2024-05-02|2024-05-03 2019-06-25|2019-12-31 2020-01-01|2020-12-31 2021-01-01|2021-12-31 2022-01-01|2022-12-31 2023-01-01|2023-12-31 2024-01-01|2024-01-15
内容的提问来源于stack exchange,提问作者zaino22
相关产品推荐
相关产品推荐

