Как я могу преобразовать интервал в количество часов с Postgres?

161

Скажем, у меня есть интервал, как

4 days 10:00:00

в postgres. Как я могу преобразовать это в количество часов (106 в данном случае?) Есть ли функция или я должен укусить пулю и сделать что-то вроде

extract(days, my_interval) * 24 + extract(hours, my_interval)
agnul
источник
9
Примечание. Если ваш интервал содержит месяцы или годы, то нет определенного ответа о количестве часов, поскольку количество дней в месяце или году различается. Так что следите за этим!
Тедди

Ответы:

314

Вероятно, самый простой способ это:

SELECT EXTRACT(epoch FROM my_interval)/3600
Магнус Хагандер
источник
6
И, возможно, слово или
приведёт
64
Извлечь эпоху? О боже, это не пришло бы мне в голову через миллион лет.
agnul
5
SELECT EXTRACT (эпоха от my_interval / 3600) (интервал имеет встроенную поддержку «деления целого числа», результат - интервал, а результат извлечения - целое число, а не число с плавающей запятой). Так. Автокаст / Пол сделан.
Оффенсо
19
Предупреждение: простое извлечение эпох подразумевает, что один месяц = ​​30 дней, а один год = 365,25 дня.
Тедди
@ Тедди, что мы можем с этим сделать? Как избежать этой проблемы и получить реальное количество эпох?
Asmox
18

Если вы хотите целое число, то есть количество дней:

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когда только один аргумент.
1111161171159459134
7
Предупреждение: простое извлечение эпох подразумевает, что один месяц = ​​30 дней, а один год = 365,25 дня.
Тедди
3

Чтобы узнать количество дней, проще всего было бы:

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;
belveryin
источник
28
Если ваш интервал '1 month 0 days', использование extract(day from …)даст вам 0в качестве результата.
Underyx
1
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.

Haoming
источник
1

Если вы конвертируете поле таблицы:

  1. Определите поле так, чтобы оно содержало секунды:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Извлеките значение. Не забывайте приводить к int другим, вы можете получить неприятный сюрприз, когда интервалы будут большими:

    EXTRACT(EPOCH FROM field)::int

Янек Ольшак
источник
Я не думаю, что Redshift поддерживает тип данных INTERVAL. Это было бы просто БОЛЬШОЙ.
matt2000
-4
         select date 'now()' - date '1955-12-15';

Вот простой запрос, который вычисляет общее количество дней.

Арункумар Папена
источник
4
Это не принимает значение интервала.
Тедди