我在将时间戳参数传递给psql时遇到了问题。在$since变量中,可以按照SQL标准格式化任何字符串,并将此值传递给sql,如下所示:
首先,我检查$since是否采用正确的格式(如果它失败了,它不会继续):
1) psql --command "SELECT ($since)::TIMESTAMPTZ;"
其次,我在函数中使用了值(它以时间戳作为输入参数):
2) cmd="SELECT myfunc($since);" psql --command "$cmd" $DBNAME
Works:if since="NOW() - INTERVAL '5 months'"
不工作:如果since="2017-10-23 10:42:48" (在第1行失败: SELECT (2017-10-23 10:42:48)::TIMESTAMPTZ;since="2017-10-23 10:42:48";错误)
我试图用‘、“、\字符来转义$since字符串,但是在使用bash和sql进行了多次组合之后,我放弃了。在这种情况下,正确的转义方法是什么?
发布于 2018-03-23 23:18:22
如果需要将字符串强制转换为TIMESTAMPTZ,则需要在创建变量时将$since值括在“”中。
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)https://stackoverflow.com/questions/49446783
复制相似问题