Próbuję użyć java.util.Date
jako danych wejściowych, a następnie utworzyć z nim zapytanie - więc potrzebuję java.sql.Date
.
Byłem zaskoczony, gdy przekonałem się, że nie można przeprowadzić konwersji w sposób pośredni lub jawny - ale nawet nie wiem, jak to zrobić, ponieważ Java API jest dla mnie całkiem nowy.
import java.sql.*
moim kodzie był błąd, zastępujący plik java.util.date i powodujący problemy przy przypisywaniu wartości daty, które były w porządku z tym ostatnim, ale nie pierwszym. HTHDATE
oznacza tylko datę.Odpowiedzi:
tl; dr
Nie rób Obie klasy są przestarzałe.
java.util.Date
ijava.sql.Date
JDBC 4.2 lub nowszego.Przykładowe zapytanie z
PreparedStatement
.Części zamienne:
Instant
zamiastjava.util.Date
Oba stanowią moment w UTC. ale teraz z nanosekundami zamiast milisekund.
LocalDate
zamiastjava.sql.Date
Oba reprezentują tylko datę, bez pory dnia i strefy czasowej.
Detale
Jeśli próbujesz pracować z wartościami opartymi tylko na dacie (bez pory dnia, strefy czasowej), użyj
LocalDate
klasy zamiastjava.util.Date
.java.time
W Javie 8 i nowszych kłopotliwe stare klasy daty i czasu dołączone do wczesnych wersji Javy zostały zastąpione przez nowy pakiet java.time . Zobacz samouczek Oracle . Duża część funkcji została przeniesiona z powrotem do Java 6 i 7 w ThreeTen-Backport, a następnie dostosowana do Androida w ThreeTenABP .
SQL typ danych
DATE
ma być data-tylko, ze nie ma czasu na dzień i bez strefy czasowej. Java nigdy nie miała takiej klasy † aż do wersjijava.time.LocalDate
Java 8. Stwórzmy taką wartość, uzyskując dzisiejszą datę według określonej strefy czasowej (strefa czasowa jest ważna przy ustalaniu daty, kiedy nowy dzień zaczyna się wcześniej w Paryżu niż w Montrealu, ponieważ przykład).W tym momencie możemy być skończeni. Jeśli Twój sterownik JDBC jest zgodny ze specyfikacją JDBC 4.2 , powinieneś być w stanie przejść
LocalDate
przezsetObject
wPreparedStatement
celu zapisania w polu „DATA SQL”.Podobnie, użyj,
ResultSet::getObject
aby pobrać z kolumny DATA SQL do JavyLocalDate
obiektu . Określenie klasy w drugim argumencie powoduje, że kod jest bezpieczny dla typu .Innymi słowy, całe to pytanie nie ma znaczenia w JDBC 4.2 lub nowszym.
Jeśli sterownik JDBC nie działa w ten sposób, musisz wrócić do konwersji na typy java.sql.
Konwertuj na java.sql.Date
Aby przekonwertować, użyj nowych metod dodanych do starych klas daty i godziny. Możemy zadzwonić,
java.sql.Date.valueOf(…)
aby przekonwertowaćLocalDate
.I iść w innym kierunku.
Konwertowanie z
java.util.Date
Chociaż powinieneś unikać używania starych klas daty i godziny, możesz być do tego zmuszony podczas pracy z istniejącym kodem. Jeśli tak, możesz przekonwertować na / z java.time.
Przejdź przez
Instant
klasę, która reprezentuje chwilę na osi czasu w UTC.Instant
Jest podobny pomysłu dojava.util.Date
. Pamiętaj jednak, żeInstant
ma rozdzielczość do nanosekund, a rozdzielczośćjava.util.Date
tylko milisekund .Aby przekonwertować, użyj nowych metod dodanych do starych klas. Na przykład
java.util.Date.from( Instant )
ijava.util.Date::toInstant
.Aby ustalić datę, potrzebujemy kontekstu strefy czasowej. W danym momencie data zmienia się na całym świecie w zależności od strefy czasowej. Zastosuj a,
ZoneId
aby uzyskaćZonedDateTime
.† Klasa java.sql.Date udaje, że jest tylko datą, bez pory dnia, ale w rzeczywistości robi porę dnia, dostosowaną do północy. Zagmatwane? Tak, stare lekcje daty i godziny są bałaganem.
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Nieważne....
wyjaśnia to. Link to http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
źródło
epochseconds
ie milisekund po1,JAN,1970
. Ale co, jeśli chcemy zapisać datę osoby przed tą datą .... lub coś w stylu0000-00-00 as default
Z drugą odpowiedzią możesz mieć problemy z informacją o czasie (porównaj daty z nieoczekiwanymi wynikami!)
Sugeruję:
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .Ta funkcja zwróci skonwertowaną datę SQL z obiektu daty java.
źródło
Konwersja
java.util.Data
najava.sql.Data
straci godzinę, minutę i sekundę. Więc jeśli jest to możliwe, sugeruję użyćjava.sql.Timestamp
tego w następujący sposób:Aby uzyskać więcej informacji, możesz sprawdzić to pytanie .
źródło
W moim przypadku wybranie daty z JXDatePicker (kalendarz java) i zapisanie jej w bazie danych jako typ daty SQL, poniżej działa dobrze.
java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());
gdzie pickedDate jest obiektem JXDatePicker
źródło
Ta funkcja zwróci skonwertowaną datę SQL z obiektu daty java.
źródło
Najpierw sformatuj plik java.util.Date. Następnie użyj sformatowanej daty, aby uzyskać datę w java.sql.Date
źródło
Tutaj przykład konwersji daty Util na datę Sql i ten jest jednym z przykładów, których używam w moim projekcie, może ci również pomóc.
źródło
Jestem nowicjuszem: po długim bieganiu działało. Myśl może być przydatna
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .Tutaj javaDate jest instancją java.util.Date
źródło
Metoda porównywania 2 dat (data.data lub data_sql)
źródło
spróbuj tego
źródło
Myślę, że najlepszym sposobem na konwersję jest:
Jeśli chcesz wstawić
dt
zmienną do tabeli SQL, możesz:źródło
używam następującego kodu, proszę wypróbować
określ format daty, którą chcesz na przykład,
"DD-MM_YYYY"
lub'YYYY-mm-dd'
następnie użyj typu danych Data Java jakowtedy przeanalizuje twoją datę
źródło
Możesz użyć tej metody do konwersji daty użycia na datę sql,
źródło
Próbowałem następującego kodowania, które działało dobrze.
źródło
Jeśli korzystasz z Myysql, kolumna daty może zostać przekazana jako ciąg znaków reprezentujący tę datę
więc używam klasy DateFormatter do sformatowania go, a następnie ustawiam go jako ciąg w instrukcji sql lub instrukcji przygotowanej
oto ilustracja kodu:
String date = converUtilDateToSqlDate (otherTransaction.getTransDate ());
// następnie podaj tę datę w instrukcji sql
źródło