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

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')

代码说明

  1. 格式转换:用sed正则表达式快速将DD/MM/YYYY替换为YYYY-MM-DD(date命令原生支持的格式),相比awk更简洁高效。
  2. 时间计算:将转换后的日期与-3 hours拼接在同一个-d参数中,让date基于用户输入的日期执行减3小时操作,避免了多-d参数的冲突问题。
  3. 输出适配:通过+"%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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:34:59