Postgres SQL с использованием CTE при вычитании дат - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь вычесть текущую дату в зависимости от целочисленного результата оператора select из cte_film. Однако размещение оператора select внутри интервала select now () вызывает у меня проблемы.

WITH cte_film AS (
SELECT configvalue from TRAC.configvalues con where configcd = 'processingday'
),
cte_filma AS
(SELECT now() - (select configvalue from cte_film) * INTERVAL '1 day')
SELECT * from cte_filma;

ОШИБКА: оператор не существует: изменение символа * интервал
LINE 5: ... SELECT now () - (выберите configvalue из cte_film) * INTERVAL ... ^ СОВЕТ: ни один оператор не соответствует заданному имени и типу (аргументам) аргумента. Возможно, вам придется добавить явные приведения типов.

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Возможно, я упрощаю вашу проблему, но, насколько я понимаю, вам вообще не нужен CTE. Попробуйте это:

SELECT now() - configvalue
FROM trac.configvalues 
WHERE configcd = 'processingday'

Если вам не нужны часы, используйте current_date вместо now(). Смотрите разницу:

SELECT current_date - 1, now() - '1 day'::INTERVAL;

  ?column?  |           ?column?            
------------+-------------------------------
 2020-03-11 | 2020-03-11 16:23:56.384132+01
(1 Zeile)
0 голосов
/ 12 марта 2020

Спасибо за ваш вклад. Мне удалось решить проблему с помощью cte_filma AS (SELECT now() - INTERVAL '1 day' configvalue FROM cte_film).

WITH cte_film AS (
SELECT configvalue from TRAC.configvalues con where configcd = 'processingday'
),
cte_filma AS (SELECT now() - INTERVAL '1 day' processingdate FROM cte_film),
maxi as (select max(workdt) as defaulterdatefrom from trac.defaulteraction)
SELECT DATE_PART('day', defaulterdatefrom::timestamp - processingdate::timestamp) as 
SourceCount from cte_film,cte_filma,maxi;

enter image description here

0 голосов
/ 12 марта 2020

Измените свой второй CTE следующим образом:

WITH 
  cte_film AS (
    SELECT configvalue 
    FROM TRAC.configvalues
    WHERE configcd = 'processingday'
  ),
  cte_filma AS (
    SELECT now() - configvalue::int  * INTERVAL '1 day'::interval
    FROM cte_film
  )
SELECT * FROM cte_filma;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...