如何将时间戳从bash传递给psql

时间:2018-03-23 09:52:32

标签: bash timestamp escaping psql

我遇到将timestamp参数传递给psql的问题。在$since变量中,我可以根据SQL标准格式化任何字符串,并将此值传递给sql,如下所示:

首先,我检查$since格式是否正确(如果失败则不会继续):
1)psql --command "SELECT ($since)::TIMESTAMPTZ;"

其次我使用函数中的值(它将timestamptz作为输入参数):
2)cmd="SELECT myfunc($since);" psql --command "$cmd" $DBNAME

作品:如果since="NOW() - INTERVAL '5 months'"
不起作用:if since="2017-10-23 10:42:48"(在第1行上失败:SELECT(2017-10-23 10:42:48):: TIMESTAMPTZ;错误)

我试图用',',\字符以某种方式逃避$since字符串,但在bash和sql中的许多组合之后我放弃了。 在这种情况下逃脱的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您需要将字符串强制转换为TIMESTAMPTZ,那么您需要将$的值包含在' ',或者在创建变量

since="'2017-10-23 10:42:48'"

或将其传递给psql:

since="2017-10-23 10:42:48"
psql --command "SELECT '$since'::TIMESTAMPTZ ;"

如果您需要传递字符串或表达式,例如NOW() - INTERVAL '1 day',那么在将值分配给变量时,您最好决定引用,所以:

$ since="'2017-10-23 10:42:48'"
$ psql postgres --command "SELECT $since::TIMESTAMPTZ ;"
      timestamptz       
------------------------
 2017-10-23 10:42:48+02
(1 row)
$ since="(NOW() - INTERVAL '1 day')"
$ psql postgres --command "SELECT $since::TIMESTAMPTZ ;"
          timestamptz          
-------------------------------
 2018-03-24 08:49:24.577356+01
(1 row)