Як перетворити інтервал у кількість годин за допомогою постгресів?


161

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

4 days 10:00:00

в постгресах. Як перетворити це на кількість годин (106 в даному випадку?) Чи є функція чи я повинен кусати кулю і робити щось подібне

extract(days, my_interval) * 24 + extract(hours, my_interval)

9
Примітка: Якщо ваш інтервал містить місяці чи роки, немає визначеної відповіді, скільки годин є, оскільки кількість днів у місяці чи році змінюється. Тож стежте за цим!
Тедді

Відповіді:


314

Напевно, найпростіший спосіб:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
І, можливо, підлогу або подати результат на ціле число, якщо інтервал містить хвилини та / або секунди
rasjani

64
Витягувати епоху? О мій, це не перейшло б мені на думку мільйон років.
agnul

5
ВИБІР ЕКСТРАКТ (епоха ВІД my_interval / 3600) (інтервал має нативну підтримку 'поділити ціле число', результат - інтервал, а результат вилучення - цілий, а не плаваючий). Так. Автомобільна передача / Підлога зроблена.
Offenso

19
Попередження: просто вилучення епохи неявно передбачає, що один місяць = 30 днів і один рік = 365,25 днів.
Тедді,

@ Тедді, що ми можемо з цим зробити? Як уникнути цього питання та отримати реальну кількість епох?
Асмокс

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;

27
Якщо ваш інтервал - '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.


1

Якщо перетворити поле таблиці:

  1. Визначте поле, щоб воно містило секунди:

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

    EXTRACT(EPOCH FROM field)::int


Я не думаю, що Redshift підтримує тип даних INTERVAL. Це було б ДОВІЛЬНО.
matt2000

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.