我运行这样的查询:
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...
^
请帮助,谢谢。
答案 0 :(得分:2)
我的理解是Postgres allows type 'string'
语法,用于指定简单文字常量的类型。除此之外,您还必须使用...::type
或CAST ( ... 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
然而,治愈更简单。只是不添加另一个演员,这是多余的。