2010-07-24 16 views

Respuesta

90

En el lado de Java, la fecha suele estar representada por (java.util.Date mal diseñado, pero aparte). Básicamente está respaldado por el Epoch time en el sabor de un long, también conocido como marca de tiempo. Contiene información sobre las partes de fecha y hora. En Java, la precisión está en milisegundos.

En el lado de SQL, hay varios tipos de fecha y hora estándar, DATE, TIME y TIMESTAMP (en casa de alguna base de datos también llamado DATETIME), que están representados en JDBC como java.sql.Date, java.sql.Time y java.sql.Timestamp, todos subclases de java.util.Date. La precisión depende de la base de datos, a menudo en milisegundos, como Java, pero también puede estar en segundos.

En contrario a java.util.Date, el java.sql.Date contiene solo información sobre la parte de la fecha (año, mes, día). El Time contiene solo información sobre la parte de tiempo (horas, minutos, segundos) y el Timestamp contiene información sobre las dos partes, como java.util.Date.

La práctica normal para almacenar una marca de tiempo en el DB (por lo tanto, java.util.Date en lado de Java y java.sql.Timestamp en lado JDBC) es utilizar PreparedStatement#setTimestamp().

java.util.Date date = getItSomehow(); 
Timestamp timestamp = new Timestamp(date.getTime()); 
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?"); 
preparedStatement.setTimestamp(1, timestamp); 

La práctica normal para obtener una marca de tiempo de la DB es utilizar ResultSet#getTimestamp().

Timestamp timestamp = resultSet.getTimestamp("ts"); 
java.util.Date date = timestamp; // You can just upcast. 
+6

¿crees que usar java.sql.Timestamp en el modelo (capa de Java) es malo? – cherouvim

+7

@cherouvim: Sí. El modelo no debe conocer ninguna especificación de JDBC. Úselo solo para configurar la marca de tiempo. 'preparedStatement.setTimestamp (new Timestamp (date.getTime()));'. Obtenerlo es fácil ya que ya es una subclase de 'java.util.Date'. – BalusC

+1

Esto funcionará bien si todas sus máquinas y usuarios están en la misma zona horaria. De lo contrario, tenga cuidado con el manejo del controlador JDBC de MySQL de las conversiones de zona horaria es increíblemente complejo y con errores. Por ejemplo, vea http: // stackoverflow.com/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-of-datetime-and-timestamp/40681941 # 40681941 –

6

El MySQL documentation tiene información sobre la asignación de tipos de MySQL a los tipos de Java. En general, para datetime y timestamps de MySQL debe usar java.sql.Timestamp. Unos recursos incluyen:

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

How to store Java Date to Mysql datetime...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

EDIT:

Como otros han indicado, la sugerencia del uso de cadenas puede dar lugar a problemas.

+0

¿por qué sería mejor convertir las fechas en cadenas? – cherouvim

+6

No lo masajes adelante y atrás como hilo. Es una receta para problemas de portabilidad y mantenimiento. – BalusC

+0

De acuerdo. He modificado mi respuesta en consecuencia. – Garett

Cuestiones relacionadas