W aplikacji java, jaki byłby dobry kompromis pod względem odczytywania i wprowadzania informacji o dacie z bazą danych MySQL przy użyciu kombinacji dat i czasu oraz znaczników czasu?Obsługa datowników i sygnatur czasowych MySQL w Javie
Odpowiedz
Po stronie Java data jest zwykle reprezentowana przez (źle zaprojektowane, ale na marginesie) java.util.Date
. Zasadniczo jest on wspierany przez Epoch time w smaku long
, znany również jako znacznik czasu. Zawiera informacje na temat części daty i godziny. W Javie dokładność wynosi milisekundy.
W SQL strony, istnieje kilka standardowych typów daty i czasu, DATE
, TIME
i TIMESTAMP
(w niektórych DB zwany także DATETIME
), które są przedstawione w JDBC jako java.sql.Date
, java.sql.Time
i java.sql.Timestamp
, wszystkie podklasy z java.util.Date
. Precyzja zależy od DB, często w milisekundach, takich jak Java, ale może być również w sekundach.
W przeciwieństwie do java.util.Date
, java.sql.Date
zawiera tylko informacje o części daty (rok, miesiąc, dzień). Numer Time
zawiera tylko informacje o części czasowej (godziny, minuty, sekundy), a Timestamp
zawiera informacje o obu częściach, takie jak: java.util.Date
.
normalna praktyka do przechowywania znacznik czasu w DB (czyli java.util.Date
Java i w bok w bok java.sql.Timestamp
JDBC) jest użycie 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);
Normalną praktyką jest uzyskanie z bazy danych znacznika czasu jest użycie ResultSet#getTimestamp()
.
Urządzenie MySQL documentation ma informacje na temat mapowania typów MySQL na typy Java. Ogólnie dla datetime i znaczników czasowych MySQL należy użyć java.sql.Timestamp
. Kilka zasoby obejmują:
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:
Jak wykazały inne sugestia użycia strun może prowadzić do problemów.
- 1. Mongoid: Typ sygnatur czasowych?
- 2. Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS nie wyłączając sygnatur czasowych na wiosnę
- 3. Obsługa joysticka w Javie
- 4. . Biblioteka biblioteki do przenoszenia/kopiowania pliku z zachowaniem sygnatur czasowych
- 5. Obsługa VB w Javie 6?
- 6. MySQL: Uzyskaj średnią różnic czasowych?
- 7. MySQL - SUM grupy różnic czasowych
- 8. Dane szeregów czasowych w MySQL: próbkowanie
- 9. Obsługa restartu mysql w SQLAlchemy
- 10. Obsługa błędów w Pythonie-MySQL
- 11. Obsługa znaków pełnotekstowych MySQL
- 12. Obsługa bezpiecznych varargów w Javie 6 i 7, potrzebne wyjaśnienie
- 13. Obsługa błędów transakcji mysql
- 14. Obsługa alertów za pomocą HtmlUnitDriver w Javie
- 15. Obsługa plików do pobrania w Javie
- 16. Pisanie niestandardowego filtra DirectShow RTSP/RTP Source - dane sygnatur czasowych pochodzące ze źródeł na żywo
- 17. Metoda wyszukiwania przerw w danych szeregów czasowych w MySQL?
- 18. "Ręczna" rozdzielczość przeciążania sygnatur
- 19. Wykrywanie szkodliwego oprogramowania sygnatur
- 20. Obsługa pustego zestawu w instrukcji CASE MySQL
- 21. Procedura zapisana w MySQL Obsługa błędów
- 22. DateTime.Ticks, DateTime.Equals i stref czasowych
- 23. moment.js, stref czasowych i letniego
- 24. Pliki sygnatur i modyfikatory dostępu w języku F #
- 25. Obsługa wyjątków C++ w Javie za pomocą SWIG
- 26. Dane MySQL grupowego do arbitralnie zmienionych przedziałów czasowych
- 27. Przesunięcie przedziałów czasowych dla danych szeregów czasowych w R
- 28. Mysql stref czasowych na windows 7 nie są aktualizowane
- 29. Obsługa nieruchomości w Scala
- 30. Używanie datowników jQuery z układem innym niż tabelaryczny
myślisz, że używanie java.sql.Timestamp w modelu (warstwa Java) jest złe? – cherouvim
@cherouvim: Tak. Model nie powinien być świadomy żadnych szczegółów JDBC. Używaj go tylko do ustawiania znacznika czasu. 'preparedStatement.setTimestamp (new Timestamp (date.getTime()));'. Uzyskanie go jest łatwe, ponieważ jest już podklasą 'java.util.Date'. – BalusC
To zadziała dobrze, jeśli wszystkie twoje komputery i użytkownicy będą w tej samej strefie czasowej. W przeciwnym razie należy uważać, że obsługa sterownika JDBC przez sterownik JDBC dla stref czasowych jest niesamowicie złożona i nieporęczna. Na przykład zobacz http: // stackoverflow.com/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-of-datetime-and-timestamp/40681941 # 40681941 –