我遇到将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中的许多组合之后我放弃了。
在这种情况下逃脱的正确方法是什么?
答案 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)