Разница отметок времени в часах для PostgreSQL

Существует ли эквивалент TIMESTAMPDIFF () для PostgreSQL?

Я знаю, что могу вычесть две временные метки, чтобы получить postgresql ИНТЕРВАЛ . Я просто хочу, чтобы разница между двумя временными метками в часах была представлена ​​INT.

Я могу сделать это в MySQL следующим образом:

TIMESTAMPDIFF(HOUR, links.created, NOW())

Мне просто нужна разница между двумя временными метками в часах, представленными в виде целого числа.

Решение работает для меня:

SELECT "links_link"."created",
"links_link"."title",
(EXTRACT(EPOCH FROM current_timestamp - "links_link"."created")/3600)::Integer AS "age" 
FROM "links_link"
53
задан Eric Leschinski 10 December 2013 в 04:52
поделиться

2 ответа

Первое, что всплывает

EXTRACT(EPOCH FROM current_timestamp-somedate)/3600

может быть некрасиво, но разблокирует дорогу. Может быть красивее, если бы было определено деление интервала на интервал.

Edit: если вы хотите, чтобы он был больше нуля, используйте abs или greater(...,0). Что бы ни подходило под ваши намерения.

Edit++: причина, по которой я не использовал age, заключается в том, что age с единственным аргументом, чтобы процитировать документацию: вычесть из текущей_даты (в полночь). Это означает, что вы не получите точного "возраста", если не работаете в полночь. Сейчас почти 1 час ночи:

select age(current_timestamp);
       age        
------------------
 -00:52:40.826309
(1 row)
78
ответ дан 7 November 2019 в 08:26
поделиться

Вы можете использовать функции "extract" или "date_part" как на интервалах, так и на отметках времени, но я не думаю, что это делает то, что вы хотите. Например, она дает 3 для интервала '2 дня, 3 часа'. Тем не менее, вы можете преобразовать интервал в количество секунд, указав в качестве элемента времени 'epoch': extract(epoch from '2 days, 3 hours'::interval) возвращает 183600 (который вы затем делите на 3600, чтобы преобразовать секунды в часы).

Таким образом, сложив все это вместе, вы получите в основном ответ Майкла: extract(epoch from timestamp1 - timestamp2)/3600. Так как, похоже, вас не волнует, какая временная метка перед какой, вы, вероятно, захотите обернуть это в abs:

SELECT abs(extract(epoch from timestamp1 - timestamp2)/3600)
7
ответ дан 7 November 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: