sql >> Database >  >> RDS >> Oracle

Hoe het Oracle-datumformaat naar Java te converteren?

tl;dr

Nee, dat doe je niet.

  • Databases zoals Oracle slaan datum-tijd-waarden op met hun eigen intern gedefinieerde binaire waarden, niet als platte tekst.
  • Oracle DATE type bevat zowel een tijd van de dag als een datum.

DATE =datum + tijd van de dag

De DATE type in Oracle-database heeft een verkeerde naam. Het bevat meer dan een datum (jaar, maand en dag van de maand).

Dit type vertegenwoordigt een datum waarbij de tijd van de dag wordt omgezet in hele seconden. Dit type mist de context van een tijdzone of offset-van-UTC. Dit type kan dus niet worden gebruikt om een ​​moment, een specifiek punt op de tijdlijn weer te geven. (Om een ​​moment bij te houden, gebruikt u Oracle-type TIMESTAMP WITH TIME ZONE .)

Merk op dat deze Oracle-naamgeving verschilt van de SQL-standaard. In de standaard, een DATE type is een waarde voor alleen de datum, zonder tijd van de dag en zonder tijdzone of offset.

java.time.LocalDateTime

Dus dit type verwijst naar LocalDateTime op Java.

Ophalen.

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

Opslag.

myPreparedStatement.setObject( … , ldt ) ;

Tekst

Merk op dat we in de bovenstaande code slimme objecten gebruiken in plaats van domme strings.

Datum-tijd-objecten zoals LocalDateTime zijn niet String en houd geen tekst vast. Ze vertegenwoordigen intern hun waarde op hun eigen manier. U kunt een tekenreeks ontleden als een datum-tijd-object en u kunt het datum-tijd-object vragen om tekst te genereren. Maar de tekst en het datum-tijd-object zijn gescheiden en onderscheiden.

De java.time klassen gebruiken standaard ISO 8601 formaten bij het ontleden/genereren van strings.

String output = ldt.toString() ;

Parseren.

U kunt tekst in andere formaten genereren. U kunt uw eigen aangepaste indeling opgeven door DateTimeFormatter.ofPattern . aan te roepen . Meestal beter om automatisch te formatteren door DateTimeFormatter.ofLocalized… . aan te roepen methoden.

Dit is al vele malen behandeld op Stack Overflow. Dus zoek voor meer informatie.

LocalDateTime ldt = LocalDateTime.parse( "2020-01-23T01:23:45.123456789" ) ;

Over java.time

De java.time framework is ingebouwd in Java 8 en hoger. Deze klassen vervangen de lastige oude legacy date-time klassen zoals java.util.Date , Calendar , &SimpleDateFormat .

Zie voor meer informatie de Oracle-zelfstudie . En zoek Stack Overflow voor veel voorbeelden en uitleg. Specificatie is JSR 310 .

De Joda-Time project, nu in onderhoudsmodus , adviseert migratie naar de java.time lessen.

Je mag java.time ruilen objecten rechtstreeks met uw database. Gebruik een JDBC-stuurprogramma voldoet aan JDBC 4.2 of later. Geen strings nodig, geen java.sql.* klassen. Hibernate 5 &JPA 2.2 ondersteunen java.time .

Waar zijn de java.time-klassen te verkrijgen?



  1. Mysql-optimalisatie voor REGEXP

  2. Wanneer *niet* voorbereide verklaringen gebruiken?

  3. Oracle SELECT TOP 10-records

  4. JPA + Hibernate:een beperking definiëren met ON DELETE CASCADE