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

109

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

4 days 10:00:00

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

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

6 ответов

215
Лучший ответ

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

SELECT EXTRACT(epoch FROM my_interval)/3600
  • 6
    И, возможно, слово или приведёт результат к целому числу, если интервал содержит минуты и / или секунды
  • 45
    Извлечь эпоху? О боже, это не пришло бы мне в голову через миллион лет.
Показать ещё 2 комментария
13

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

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int
  • 0
    Большой! Спасибо вам за это :) Тем не менее, я обнаружил, что теперь мы можем изменить это на SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400 (я использую Pg 9.4), поскольку age(ts) автоматически использует CURRENT_DATE когда только один аргумент.
  • 2
    Предупреждение: простое извлечение эпох подразумевает, что один месяц = 30 дней, а один год = 365,25 дня.
6

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

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

1

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

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

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

    EXTRACT(EPOCH FROM field)::int

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

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

  • 4
    Это не принимает значение интервала.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню