In un'applicazione java quale sarebbe un buon compromesso in termini di estrazione e immissione di informazioni sulla data con un database MySQL utilizzando un mix di datetime e timestamp?Gestione dei datetime e timestamp di MySQL in Java
risposta
Nel lato Java, la data è solitamente rappresentata dal (poco progettato, ma a parte) java.util.Date
. Fondamentalmente è supportato dal Epoch time nel sapore di un long
, noto anche come timestamp. Contiene informazioni su entrambe le parti di data e ora. In Java, la precisione è in millisecondi.
Nel lato SQL, ci sono diversi data e ora tipi standard, DATE
, TIME
e TIMESTAMP
(ad un certo DB chiamato anche DATETIME
), che sono rappresentati in JDBC come java.sql.Date
, java.sql.Time
e java.sql.Timestamp
, tutti sottoclassi di java.util.Date
. La precisione dipende dal DB, spesso in millisecondi come Java, ma può anche essere in secondi.
Contrariamente allo java.util.Date
, lo java.sql.Date
contiene solo informazioni sulla parte relativa alla data (anno, mese, giorno). Time
contiene solo informazioni sulla parte relativa all'ora (ore, minuti, secondi) e Timestamp
contiene informazioni su entrambe le parti, ad esempio come java.util.Date
.
La prassi normale per memorizzare un timestamp nel DB (quindi, java.util.Date
nel lato Java e java.sql.Timestamp
nel lato JDBC) è quello di utilizzare 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 prassi normale per ottenere un timestamp dal DB è quello di utilizzare ResultSet#getTimestamp()
.
Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.
MySQL documentation contiene informazioni sulla mappatura dei tipi di MySQL in tipi Java. In generale, per MySQL datetime e timestamp devi usare java.sql.Timestamp
. Poche risorse includono:
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...?
EDIT:
Come altri hanno indicato, il suggerimento di usare le stringhe può portare a problemi.
- 1. UNIX Timestamp to MySQL DATETIME
- 2. PHP-MYSQL: conversione di Unix Timestamp in DateTime e viceversa
- 3. Convertire il datetime MySQL in timestamp
- 4. MySQL converte datetime in Unix timestamp
- 5. Java 8 + Hibernate 5 MySQL TIMESTAMP/DATETIME a LocalDateTime Mapping
- 6. sequelize.js TIMESTAMP non DATETIME
- 7. Unix timestamp VS datetime
- 8. Mysql Colonne data/datetime e persistenza Java
- 9. Quando scegliamo DateTime su Timestamp
- 10. MySql TimeStamp e JavaScript Time
- 11. Salvataggio dei timestamp in Postgres in base alle date Java
- 12. Gestione dei download in Java
- 13. Convertire timestamp Unix in datetime
- 14. Converti Datetime in Unix timestamp
- 15. Timestamp Unix a .net DateTime
- 16. Abilitazione dei microsecondi in Symfony2 (Doctrine) e MySQL
- 17. MySQL: Converti INT in DATETIME
- 18. Datetime in java
- 19. Come convertire datetime() in timestamp() in erlang
- 20. Converti timestamp in datetime in erlang
- 21. Java MySQL Problemi relativi al fuso orario con timestamp
- 22. da unix timestamp a datetime
- 23. Mysql Unix-Timestamp Formato data
- 24. Che differenza tra i tipi DATE, TIME, DATETIME e TIMESTAMP
- 25. Non è possibile sottrarre datetime e timestamp in django?
- 26. unix timestamp a datetime in Android
- 27. Come convertire il timestamp DB2 in datetime?
- 28. Memorizzazione di C# datetime a postgreql TimeStamp
- 29. Gruppo MySQL per ID e ultimo datetime
- 30. mysql inserto in ritardo timestamp
pensi che l'uso di java.sql.Timestamp nel modello (livello Java) sia sbagliato? – cherouvim
@cherouvim: Sì. Il modello non dovrebbe essere a conoscenza di alcuna specifica JDBC. Usalo solo per impostare il timestamp. 'preparedStatement.setTimestamp (new Timestamp (date.getTime()));'. Ottenere è facile dato che è già una sottoclasse di 'java.util.Date'. – BalusC
Funzionerà correttamente se tutte le macchine e gli utenti si trovano nello stesso fuso orario. In caso contrario, fare attenzione alla gestione del driver JDBC MySQL delle conversioni del fuso orario è incredibilmente complessa e buggata. Ad esempio, consultare http: // StackOverflow.it/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-of-datetime-and-timestamp/40681941 # 40681941 –