You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:57