sql >> Database >  >> RDS >> PostgreSQL

Wat moet het type parameter zijn in Java als het een tijdstempel is zonder tijdzone in postgresql?

tl;dr

Voor SQL met Half-Open tijdspanne:
"SELECT * FROM tbl WHERE when !< ? AND when < ? ; "

myPreparedStatement.setObject(       // Use a prepared statement so you can pass smart objects rather than dumb strings.
    1 ,                              // Specify which placeholder is being fulfilled.
    LocalDate                        // Represent a date-only value, without time-of-day and without time zone or offset-from-UTC.
    .parse( "2014-11-20" )           // Parse an input string in standard ISO 8601 format to get a `LocalDate` object.
    .atStartOfDay()                  // Determine the first moment of the day on that date. Returns a `LocalDateTime` object representing a date with time-of-day but lacking any concept of time zone or offset-from-UTC.
) ;
myPreparedStatement.setObject( 
    2 , 
    LocalDate
    .parse( "2014-11-21" )
    .atStartOfDay()
) ;

Pas op:ik vermoed dat u het verkeerde type gebruikt voor uw kolom in uw database. Momenten kunnen alleen worden gevolgd met TIMESTAMP WITH TIME ZONE , niet TIMESTAMP WITHOUT TIME ZONE . Zoek Stack Overflow voor meer info.

Geen moment

Het antwoord van Jens is nu achterhaald. Tegenwoordig zou je de moderne java.time . moeten gebruiken klassen die de lastige oude verouderde datum-tijdklassen vervingen.

Dit gegevenstype op zowel Postgres als de SQL-standaard mist met opzet de context van een offset-van-UTC of een tijdzone. Dus pas op, dit type kan geen moment vertegenwoordigen, is niet een punt op de tijdlijn.

Nee, verkeerd gegevenstype. De java.sql.Timestamp is niet alleen legacy, en erg gebrekkig qua ontwerp. klasse vertegenwoordigt een moment, een specifiek punt op de tijdlijn. Dit komt dus niet overeen met uw kolom van het type TIMESTAMP WITHOUT TIME ZONE .

LocalDateTime

U zou in plaats daarvan de LocalDateTime . moeten gebruiken klas. Deze klasse vertegenwoordigt een datum met een tijd van de dag, maar mist enig concept van offset of tijdzone.

Om een ​​waarde uit de database op te halen.

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

Om een ​​waarde naar de database te sturen.

myPreparedStatement.setObject( … , ldt ) ;

Begin van de dag

Je hebt hier nog een mismatch. U geeft een waarde voor alleen datum op, maar uw kolom bevat waarden voor datum en tijd.

Een ander probleem:u gebruikt domme snaren waar u slimme objecten zou moeten gebruiken. Vanaf JDBC 4.2 kunnen we java.time exchange uitwisselen objecten met de database. Gebruik een PreparedStatement met tijdelijke aanduidingen, en geef objecten door via de `set

Om het probleem van de datum met de tijd van de dag op te lossen, moeten we het begin van de dag bepalen. Met LocalDateTime , hebben we geen tijdzoneafwijkingen om rekening mee te houden. De dag begint dus altijd om 00:00 uur. Toch moeten we er een gewoonte van maken om java.time . te vragen om het begin van de dag te bepalen.

LocalDate startDate = LocalDate.parse( "2014-11-20" ) ;
LocalDate stopDate = LocalDate.parse( "2014-11-21" ) ;

LocalDateTime start = startDate.atStartOfDay() ;
LocalDateTime stop = stopDate.atStartOfDay() ;

Schrijf je SQL met tijdelijke aanduidingen.

Ik stel voor dat je je denken verandert om een ​​gewoonte te maken van de Half-Open-benadering voor het definiëren van tijdsspanne. In Half-Open is het begin inclusief terwijl het einde exclusief is . Zoek dus voor de hele dag van de 20e naar datums gelijk aan of later dan de 20e, en lopen tot, maar niet inclusief de 21e. Wat dat eerste deel betreft, een kortere manier om te zeggen "gelijk aan of later" is "niet eerder", dus gebruiken we !< .

String sql = "SELECT * FROM tbl WHERE when !< ? AND when < ? ; " ;

Voer die sql string naar uw voorbereide verklaring. Geef vervolgens de twee LocalDateTime objecten voor de tijdelijke aanduidingen.

myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;


  1. Hoe voorloopnullen van datums in Oracle te verwijderen

  2. Automatische weergave-update in MySql

  3. Hoe gegevens op te halen met json uit de database en deze in de horizontale lijstweergave in Android te vullen

  4. Kolomnaam die begint met een cijfer?