【问题标题】:PSQL: Syntax error when passing set date variable into datetimePSQL:将设置日期变量传递到日期时间时出现语法错误
【发布时间】:2017-08-11 16:55:13
【问题描述】:

我在 psql 中的服务器端(使用 SSH)工作,我使用 '\set' 命令设置变量。

我担心的是:我有一个查询,我将一个设置字符串(日期)插入到日期时间中,但我得到了一个语法错误。

简单示例:

SELECT
    network_no,
    program_no,
    national_datetime.
FROM
    views
WHERE
    national_datetime
    between ':from_date 06:00:00'
    and ':to_date 05:59:59'::timestamp + '1 day'::interval

“from_date”和“to_date”已相应设置:

\set from_date 2017-07-10
\set to_date 2017-07-16

我通常知道您应该设置三组撇号以正确读取日期(我从未查过原因),但我将此日期输入日期时间,所以我认为不使用撇号会工作,但我得到这个错误:

ERROR:  invalid input syntax for type timestamp: ":from_date 06:00:00"
LINE 40: between ':from_date 06:00:00'

通常在 bash 脚本中这会起作用,因为它只传递文字字符串值,但在这种情况下,无论我在日期值周围没有放置撇号还是一组撇号,它都不会传递该值(我假设因为 PSQL 处理集合变量的方式。

我知道有办法解决这个问题,但我正在寻找一个为什么会发生这种情况的原因,以及是否有一种简单的方法来修复“无效的输入语法”——是否它是通过强制转换变量,以不同方式设置变量等。

非常感谢!

【问题讨论】:

    标签: sql postgresql datetime syntax psql


    【解决方案1】:

    :from_date 是一个不是字符串的变量。

    这是一种方法:

     date :from_date + time ' 06:00:00'
    

    请参阅https://www.postgresql.org/docs/9.2/static/functions-datetime.html 的文档

    【讨论】:

    • 这非常有效。阅读本文的任何人需要注意的一件事是,在设置变量(例如:\set from_date '''2017-07-10''')时,您仍然需要执行三组撇号以使其读入正确。此外,上述答案的结果类型将隐式计算为时间戳,因此,如果您也有要添加的间隔逻辑,您可以在等式中添加类似 (+ '1 day'::interval) 的内容没有明确的类型转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多