Что не так с моим полу-продвинутым PostgreSQL запросом? (Относится к расчету с временами и временными интервалами.) - PullRequest
1 голос
/ 15 февраля 2020

Цель:

Иметь столбец (которого нет в таблице), показывающий количество секунд, оставшихся до следующего повторяющегося события, которое является определяется как «последнее выполнено» (timestamptz) в сочетании со столбцом «строка временного интервала», который представляет собой строку, например «7 дней», «25 минут» или «2 недели» (стандартные интервальные строки, совместимые с PG).

Запрос:

SELECT 
    *, 
    now() - "last done" - "time span string"::interval AS "seconds left until next" 
FROM "recurring events" 
ORDER BY "seconds left until next" DESC NULLS LAST;

В столбце «Осталось секунд до следующего» странным образом получаются такие значения, как:

-1 days +00:32:04.389802

Пример ожидаемого значения :

123456

Я не понимаю, почему он не рассчитывается по столбцам. Кажется, что они строят строку их значений интерпретированным образом или что-то в этом роде. Я не знаю, как это описать.

Я пытался :: целое число выражение AS, но это просто дает мне ошибку:

ERROR: cannot cast type interval to integer

Вопрос не столько о правильной «формуле» / порядке фактического выражения, сколько факте, что он не превращает столбец (или, скорее, ячейку) в целое число (представляющее количество секунд, оставшихся для этого события до следующего раза).

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Значение, которое вы вычитаете, уже выглядит как количество секунд. Итак, просто вычтите две даты / времени, а затем конвертируйте в секунды и вычтите временной интервал:

extract(epoch from (now() - "last done")) - "time span string"
0 голосов
/ 15 февраля 2020

now() - "last done" - "time span string"::interval

В арифметике даты Postgres 'вычитание временных меток генерирует данные типа interval, которые вы видите в результате.

Вы можете включить это в секундах с помощью extract():

extract(epoch from (now() - "last done" - "time span string"::interval))
...