Найти разницу в часах или минутах между 2 java.sql.Timestamps?

Я храню java.sql.Timestamp в базе данных postgresql как тип данных Timestamp, и я хочу узнать разницу в минутах или часах от той, которая хранится в БД, до текущей метки времени. Каков наилучший способ сделать это? Есть ли встроенные методы для него или мне нужно преобразовать его в длинный или что-то?

Ответ 1

Я закончил использовать это, просто хочу опубликовать его для других, если они его ищут.

public static long compareTwoTimeStamps(java.sql.Timestamp currentTime, java.sql.Timestamp oldTime)
{
    long milliseconds1 = oldTime.getTime();
  long milliseconds2 = currentTime.getTime();

  long diff = milliseconds2 - milliseconds1;
  long diffSeconds = diff / 1000;
  long diffMinutes = diff / (60 * 1000);
  long diffHours = diff / (60 * 60 * 1000);
  long diffDays = diff / (24 * 60 * 60 * 1000);

    return diffMinutes;
}

Ответ 2

Для добавления даты/удаления это моя общая функция:

public static Date addRemoveAmountsFromDate(Date date, int field, int amount) {
    Calendar tempCalendar = Calendar.getInstance();

    tempCalendar.setTime(date);
    tempCalendar.add(field, amount);

    return tempCalendar.getTime();
}

пример для "поля": Calendar.HOUR_OF_DAY, Calendar.MINUTE

Ответ 3

Просто используйте:

Date.compareTo(Date) 

Вам нужно сначала преобразовать java.sql.Timestamps в Date.

Ответ 4

Используйте функцию UNIX_TIMESTAMP, чтобы преобразовать DATETIME в значение в часах, минутах и ​​секундах.
И если вы не уверены, какое значение больше, то используйте функцию ABS.

Ответ 5

date_part функция может дать вам hours или, поскольку интерес может быть, но это своего рода substr и, следовательно, не может полагаться на него. Вам нужно преобразовать значение timestamp в unix_timestamp и extract общее количество прошедших часов, минут или все, что имеет значение с вашего timestamp до current_timestamp.

Пример:

select age( now(), timestamp '2010-11-12 13:14:15' );  
//results the interval to be "*1 year 6 mons 2 days 04:39:36.093*"  

select date_part( 'hours', age( now(), timestamp '2010-03-10 02:03:04' ) );  
// results *4* which is not correct.  

Правильное значение часов или других может быть рассчитано после нахождения общего количества секунд, прошедших с 1970 года. Этого можно достичь с помощью epoch с функцией extract.
epoch возвращает общее количество секунд с 1970-01-01 00:00:00-00. И, вы знаете, мы можем преобразовать его в часы, разделив его на 3600.

Используя epoch с extract:

select
  EXTRACT( EPOCH FROM current_timestamp - timestamp '2010-11-12 13:14:15' ) as total_seconds,
  EXTRACT( EPOCH FROM current_timestamp - timestamp '2010-11-12 13:14:15' ) / 3600 as total_hours;  
  ROUND(  
         EXTRACT( EPOCH FROM current_timestamp - timestamp '2010-11-12 13:14:15' ) / 3600  
       ) as total_hours_rounded;  

//результаты:

----------------+--------------+-----------------------  
| total_seconds | total_hours  | total_hours_rounded  |  
| --------------+--------------+----------------------|  
| 47452282.218  | 13181.189505 | 13181                |  
----------------+--------------+-----------------------  

Аналогично, мы можем извлечь другие требуемые значения и использовать по мере необходимости.