Ошибка интервала PostgreSQL - PullRequest
       4

Ошибка интервала PostgreSQL

3 голосов
/ 01 января 2012

Я запускаю такой запрос:

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 ]

2 голосов
/ 01 января 2012

Насколько я понимаю, Postgres допускает синтаксис type 'string' для указания типа простых литеральных констант. Для всего остального вы должны использовать ...::type или CAST ( ... AS type ).

1 голос
/ 01 января 2012

Вы можете упростить до:

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

Это действительно без дополнительных скобок, потому что вычитания оцениваются слева направо.
В моей первой версии одиннеобходимая пара скобок отсутствовала.

Эта форма запроса также предотвращает ошибку в случае, если license не должно быть уникальным.Вместо этого вы получите несколько строк.В этом случае и, если вам это нужно, добавьте LIMIT 1, гарантирующее одно значение.


@ Милен правильно диагностировала причину ошибки.Поэкспериментируйте с этими утверждениями, чтобы увидеть:

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

Однако лечение проще.Только не добавляйте другой состав, это излишне.

1 голос
/ 01 января 2012

Я думаю, что ваш второй запрос эквивалентен этому. Я могу ошибаться.

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

     - (SELECT expire_date - now() + interval '1 months' 
        FROM "License" WHERE license_id = 10);
1 голос
/ 01 января 2012

Ваш первый запрос эквивалентен:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...