首页 > 解决方案 > 用常量日期字符串替换 SQL 字符串中的静态子字符串

问题描述

我有一个具有内置代码处理器并支持 shell 脚本的软件。我在一个文件中有多个 SQL 字符串,这些字符串将通过软件一个接一个地处理,并且某些子字符串常量的值将是在不更改包含原始 SQL 的原始文件的情况下被该软件覆盖。您可以在运行时将替换参数传递给该软件。

下面是其中一个 SQL 的示例 sed:

echo " select * from TABLE where   DATE(TSP_DATE) between (CURRENT DATE -1 DAY) AND (CURRENT DATE)" | sed -e 's/CURRENT DATE - 1 DAY/'08/30/2018'/; s CURRENT DATE/'08/31/2018'/

我想替换子字符串

当前日期 - 1 天

与“2018 年 8 月 30 日”和

当前日期

'08/31/2018' 使用一个命令。日期字符串包括引号。

当我运行上述脚本时,出现以下错误:

sed: -e 表达式 #1,char 29: 's' 的未知选项

问候, Ankit

标签: shellunixsed

解决方案


不确定,如果你想实现一个解决方案,那比必要的复杂。

无论您使用什么 DBMS,我都非常确定它具有当前日期的功能。因此,您不必在 shell 脚本中执行此操作。

例如,当你使用 MySQL 时,你可以简单地使用这个查询:

select * from TABLE where DATE(TSP_DATE) between CURDATE() - INTERVAL 1 DAY AND CURDATE();

无论如何,当您想使用 sed 执行此操作时,您可以这样做:

echo "select * from TABLE where   DATE(TSP_DATE) between (CURRENT DATE -1 DAY) AND (CURRENT DATE)" | sed "s#CURRENT DATE -1 DAY#'08/30/2018'#;s#CURRENT DATE#'08/31/2018'#"

作为分隔符,您可以选择任何您想要的。当您选择其他东西时,/您不必一直逃避它,当您在替换字符串中使用它时。


推荐阅读