Bash脚本:用户输入日期时间减3小时的错误修正及SQL适配
问题分析与修正方案
问题根源
原脚本中date命令错误使用了两个-d参数,date只会识别最后一个-d的内容,导致实际是基于当前系统时间减去3小时,而非用户输入的日期时间,这就是结果完全不符合预期的核心原因。另外原awk分割逻辑虽能提取日期部分,但可以更简洁优化。
修正后的代码
# 用户输入的24小时制日期时间 Select_Start_date="01/10/2024 12:55:23" Select_End_date="01/10/2024 16:54:23" # 转换格式并减去3小时:先把DD/MM/YYYY HH:MM:SS转为date可识别格式,再执行减3小时操作 S_date_adj=$(date -d "$(echo "$Select_Start_date" | sed -E 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/\3-\2-\1/') -3 hours" +"%d/%m/%Y %H:%M:%S") E_date_adj=$(date -d "$(echo "$Select_End_date" | sed -E 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/\3-\2-\1/') -3 hours" +"%d/%m/%Y %H:%M:%S") echo "Actual start date: $Select_Start_date" echo "Actual End date : $Select_End_date" echo "Reducted 3 hours start date:$S_date_adj" echo "Reducted 3 hours End date :$E_date_adj" # Pipeline Query SELECT ord.order_num FROM database.s_order ord, database.S_ORDER_DTL dtl WHERE ord.created >= TO_DATE('$S_date_adj', 'dd/mm/yyyy hh24:mi:ss') AND ord.last_upd <= TO_DATE('$E_date_adj', 'dd/mm/yyyy hh24:mi:ss')
代码说明
- 格式转换:用
sed正则表达式快速将DD/MM/YYYY替换为YYYY-MM-DD(date命令原生支持的格式),相比awk更简洁高效。 - 时间计算:将转换后的日期与
-3 hours拼接在同一个-d参数中,让date基于用户输入的日期执行减3小时操作,避免了多-d参数的冲突问题。 - 输出适配:通过
+"%d/%m/%Y %H:%M:%S"指定输出格式,完美匹配后续SQL查询中TO_DATE函数的参数要求。
测试结果
运行修正后的脚本会得到符合预期的输出:
Actual start date: 01/10/2024 12:55:23 Actual End date : 01/10/2024 16:54:23 Reducted 3 hours start date:01/10/2024 09:55:23 Reducted 3 hours End date :01/10/2024 13:54:23
额外提示
- 若需处理跨天时间(比如输入
01/10/2024 02:00:00,减3小时后应为30/09/2024 23:00:00),date命令会自动处理日期滚动,无需额外逻辑。 - 所有变量引用建议加双引号(如
"$Select_Start_date"),避免输入含特殊字符时出现解析错误。
内容的提问来源于stack exchange,提问作者Praveen Mathi
相关产品推荐
相关产品推荐

