Скажем, у меня есть интервал вроде
4 days 10:00:00
в postgres. Как мне преобразовать это в течение нескольких часов (в этом случае 106)? Есть ли функция, или я должен укусить пулю и сделать что-то вроде
extract(days, my_interval) * 24 + extract(hours, my_interval)
Вероятно, самый простой способ:
SELECT EXTRACT(epoch FROM my_interval)/3600
Если вы хотите целое число, то есть количество дней:
SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int
SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400
(я использую Pg 9.4), поскольку age(ts)
автоматически использует CURRENT_DATE
когда только один аргумент.
Чтобы получить количество дней, самый простой способ:
SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');
Насколько я знаю, он будет возвращать то же самое, что:
SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;
'1 month 0 days'
, использование extract(day from …)
даст вам 0
в результате.
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));
Преобразование ::int
следует принципу округления. Если вам нужен другой результат, например, округление вниз, вы можете использовать соответствующую математическую функцию, например, floor
.
Если вы конвертируете поле таблицы:
Определите поле так, чтобы оно содержало секунды:
CREATE TABLE IF NOT EXISTS test (
...
field INTERVAL SECOND(0)
);
Извлеките значение. Не забывайте приводить к int другим, вы можете получить неприятный сюрприз, когда интервалы будут большими:
EXTRACT(EPOCH FROM field)::int
select date 'now()' - date '1955-12-15';
Вот простой запрос, который вычисляет общее количество дней.