PostgreSQL间隔错误

时间:2012-01-01 12:24:48

标签: sql postgresql

我运行这样的查询:

SELECT (SELECT expire_date FROM "License" WHERE license_id = 10)
      - interval '1 mon 133 days 22:19:49.191748'

一切都很顺利。
但是当我尝试这个时:

SELECT (SELECT expire_date FROM "License" WHERE license_id = 10)
      - interval ((SELECT expire_date-now() FROM "License" WHERE license_id = 10)
                 + interval '1 months')

我收到错误:

ERROR:  syntax error at or near "("
LINE 1: ...FROM "License" WHERE license_id = 10) - interval ((SELECT ex...
                                                             ^

请帮助,谢谢。

4 个答案:

答案 0 :(得分:2)

我的理解是Postgres allows type 'string'语法,用于指定简单文字常量的类型。除此之外,您还必须使用...::typeCAST ( ... AS type )

答案 1 :(得分:1)

您的第一个查询相当于:

SELECT expire_date - interval '1 mon 133 days 22:19:49.191748' as expire_date
FROM "License" 
WHERE license_id = 10 

第二个(尽管可能不会运行):

SELECT expire_date - (expire_date-now() + interval '1 months') 
FROM "License" 
WHERE license_id = 10

所以,你写得更好:

SELECT now() - interval '1 months'  
FROM "License" 
WHERE license_id = 10

答案 2 :(得分:1)

我认为您的第二个查询与此相同。我错了。

SELECT (SELECT expire_date 
        FROM "License" WHERE license_id = 10) 

     - (SELECT expire_date - now() + interval '1 months' 
        FROM "License" WHERE license_id = 10);

答案 3 :(得分:1)

您可以简化为:

SELECT expire_date - (expire_date - now()) - interval '1 month'
FROM   "License"
WHERE  license_id = 10

这在没有附加括号的情况下有效,因为从左到右评估减法 在我的第一个版本中,缺少一对必要的括号。

这种形式的查询还可以防止license不应该是唯一的错误。你会得到多行。在这种情况下,如果您需要它,请添加LIMIT 1保证单个值。


@Milen正确诊断出错误的原因。试试这些陈述,看看:

SELECT interval (interval '1 month');   -- error
SELECT (interval '1 month')::interval;  -- no error

然而,治愈更简单。只是不添加另一个演员,这是多余的。