【问题标题】:How to pass timestamp from bash to psql如何将时间戳从 bash 传递到 psql
【发布时间】:2018-03-23 09:52:31
【问题描述】:

我在将时间戳参数传递给 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'"
不起作用:如果since="2017-10-23 10:42:48"(它在第1行失败:SELECT(2017-10-23 10: 42:48)::TIMESTAMPTZ; 错误)

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

【问题讨论】:

    标签: bash timestamp escaping psql


    【解决方案1】:

    如果需要将字符串强制转换为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)
    

    【讨论】:

    • 但是如果你有 since="'NOW() - INTERVAL '1 day''" 呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多