Manejo de fechas y marcas de tiempo de MySQL en Java
En una aplicación Java, ¿cuál sería un buen compromiso en términos de extraer e ingresar información de fecha con una base de datos MySQL usando una combinación de fechas, horas y marcas de tiempo?
En el lado de Java, la fecha generalmente está representada por (mal diseñado, pero aparte de eso) java.util.Date
. Básicamente está respaldado por la época de época en forma de long
, también conocida como marca de tiempo. Contiene información sobre las partes de fecha y hora. En Java, la precisión es de milisegundos.
En el lado de SQL, hay varios tipos de fecha y hora estándar, DATE
y TIME
( TIMESTAMP
en algunas bases de datos también llamados DATETIME
), que se representan en JDBC como java.sql.Date
, java.sql.Time
y java.sql.Timestamp
, todas las subclases de java.util.Date
. La precisión depende de la base de datos, a menudo en milisegundos como Java, pero también puede ser en segundos.
A diferencia de java.util.Date
, java.sql.Date
contiene sólo información sobre la parte de la fecha (año, mes, día). Contiene Time
solo información sobre la parte del tiempo (horas, minutos, segundos) y contiene Timestamp
información sobre ambas partes, como lo java.util.Date
hace.
La práctica normal para almacenar una marca de tiempo en la base de datos (por lo tanto, java.util.Date
en el lado de Java y java.sql.Timestamp
en el lado de 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 base de datos es utilizar ResultSet#getTimestamp()
.
Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.
La documentación de MySQL tiene información sobre cómo asignar tipos de MySQL a tipos de Java. En general, para MySQL datetime y timestamps deberías usar java.sql.Timestamp
. Algunos 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
¿Cómo almacenar la fecha de Java en la fecha y hora de Mysql...?
http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html
EDITAR:
Como han indicado otros, la sugerencia de utilizar cadenas puede generar problemas.