2012-05-14 22 views
10

almaceno una java.sql.Timestamp en una base de datos PostgreSQL como Marca de tiempo tipo de datos y yo quiero averiguar la diferencia en cuestión de minutos u horas de la almacenada en la base de datos a la corriente marca de tiempo. ¿Cuál es la mejor manera de hacer esto? ¿Hay métodos integrados para eso o tengo que convertirlo en algo largo o algo así?encuentra la diferencia de hora o minuto entre 2 java.sql.Timestamps?

+0

posible duplicado de [Cómo calcular la diferencia entre dos de Java java.sql.Timestamps?] (Http://stackoverflow.com/questions/582278/how-to-calculate-the-difference-between- dos-java-java-sql-timestamps) –

Respuesta

17

Terminé de usar esto, solo quiero publicarlo para otros si lo buscan.

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; 
} 
+0

¡Eres el mejor! – dbrad

0

Utilice la función UNIX_TIMESTAMP para convertir DATETIME en el valor en Hora, minutos y segundos.
Y si no está seguro de qué valor es más grande, utilice la función ABS.

1

Para la fecha de añadir/eliminar esta es mi función genérica:

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

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

    return tempCalendar.getTime(); 
} 

ejemplo para "campo": Calendar.HOUR_OF_DAY, Calendar.MINUTE

1

sólo tiene que utilizar:

Date.compareTo(Date) 

Usted tiene que convertir java.sql.Timestamps en la fecha primero.

función
+0

OP quiere encontrar el tiempo transcurrido hasta ahora en forma de horas y minutos, pero no si las fechas son iguales, antes o después. –

+0

Esta respuesta no tiene nada que ver con la pregunta –

0

date_part le puede dar hours o como el interés puede ser, pero, es una especie de substr y por lo tanto no se puede confiar en ella. Necesita convertir su valor timestamp en unix_timestamp y extracttotal número transcurrido de horas, minutos o lo que sea relevante desde su timestamp hasta current_timestamp.

Ejemplo:

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. 

valor correcto de horas u otros se pueden calcular después de encontrar el número total de segundos transcurridos desde 1970. Esto se puede lograr usando epoch con extract función.
epoch devuelve el número total de segundos desde 1970-01-01 00:00:00-00. Y, sabes, podemos convertirlo en horas dividiéndolo con 3600.

Usando epoch con 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; 

// resultados:

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

Del mismo modo, podemos extraer otros valores requeridos y usarlos como se requiera.

Cuestiones relacionadas