#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 вы можете просто вычесть две метки времени, чтобы получить интервал.