Как рассчитать разницу между двумя днями в часах в PostgreSQL и вернуть в виде дней?

#sql #postgresql

Вопрос:

Я хочу рассчитать разницу между двумя датами в днях так, чтобы в течение часов с 1 по 23 мы рассматривали ее как день. например: Date1 = '2021-06-15 01:52:00.926 00'
Date2 = '2021-06-15 02:52:00.926 00' Здесь дата 1-Дата 2 = 1 час. Я хочу, чтобы это заняло 24 часа, то есть 1 день. Я пытался (Date2::DATE - Date1::DATE) , но это дает 0. Может быть два сценария: если разница между днями составляет 35 часов, она должна вернуть 3(т. е. 3 дня). Если разница между датами составляет 5 часов, он должен вернуть 1(т. е. 1 день).

Ответ №1:

Вы можете использовать epoch арифметику:

 select ceiling(extract(epoch from date2) - extract(epoch from date1)) / (24 * 60 * 60)
from t;
 

Обратите внимание, что эта конкретная формулировка учитывает все, что длится более 1 дня, как 2 дня. Я думаю, что это и есть цель вашего вопроса. Однако, если у вас действительно есть буфер на 1 час, логика может быть изменена, чтобы справиться с этим.

Комментарии:

1. Я пытался ceil((EXTRACT(EPOCH FROM Date1- Date2)/3600)/24.0) . В чем разница? Пожалуйста, объясните.

2. Одно очевидное отличие заключается в том, что date2 > date1 в ваших образцах данных. Но это тоже должно сработать.

Ответ №2:

Технически это не ответ на ваш вопрос о PostgreSQL, однако в Ingres (Postgres был преемником Ingres) у нас есть функция интервала, которая возвращает интервал между двумя датами. Есть ли у вас что-нибудь подобное в PostgreSQL?

напр. select interval('hours', date1 - date2)

Комментарии:

1. В postgres вы можете просто вычесть две метки времени, чтобы получить интервал.