sql >> Databasteknik >  >> RDS >> PostgreSQL

Vilken typ av parameter ska vara i Java när det är en tidsstämpel utan tidszon i postgresql?

tl;dr

För SQL som använder Half-Open span-of-time:
"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()
) ;

Se upp:Jag gissar att du använder fel typ för din kolumn i din databas. Ögonblick kan endast spåras med TIMESTAMP WITH TIME ZONE , inte TIMESTAMP WITHOUT TIME ZONE . Sök efter Stack Overflow för mer information.

Inte ett ögonblick

Svaret av Jens är nu föråldrat. Nuförtiden bör du använda den moderna java.time klasser som ersatte de besvärliga gamla klasserna för datum och tid.

Denna datatyp på både Postgres och SQL-standarden saknar avsiktligt sammanhanget för en offset-från-UTC eller en tidszon. Så se upp, den här typen kan inte representera ett ögonblick, är inte en punkt på tidslinjen.

Nej, fel datatyp. Förutom att vara äldre och fruktansvärt bristfällig i design, är java.sql.Timestamp klass representerar ett ögonblick, en specifik punkt på tidslinjen. Så detta är en oöverensstämmelse med din kolumn av typen TIMESTAMP WITHOUT TIME ZONE .

LocalDateTime

Du bör istället använda LocalDateTime klass. Den här klassen representerar ett datum med en tid på dagen men saknar något koncept för offset eller tidszon.

För att hämta ett värde från databasen.

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

För att skicka ett värde till databasen.

myPreparedStatement.setObject( … , ldt ) ;

Början på dagen

Du har en annan missmatch här. Du anger ett värde endast för datum men din kolumn innehåller värden för datum med tid på dagen.

Ett annat problem:Du använder dumma strängar där du borde använda smarta objekt. Från och med JDBC 4.2 kan vi byta ut java.time objekt med databasen. Använd en PreparedStatement med platshållare och skicka objekt via `uppsättningen

För att lösa datumet med tid-på-dagen-problem måste vi bestämma början på dagen. Med LocalDateTime , vi har inga tidszonavvikelser att ta hänsyn till. Så dagen börjar alltid kl 00:00. Ändå bör vi ta för vana att fråga java.time för att bestämma början på dagen.

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

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

Skriv din SQL med platshållare.

Jag föreslår att du ändrar ditt tänkande för att göra en vana av Half-Open-metoden för att definiera tidsintervall. I Half-Open är början inklusive medan slutet är exklusivt . Så för den enstaka hela dagen den 20:e, sök efter datum som är lika med eller senare än den 20:e och löper fram till, men inte inklusive den 21. När det gäller den första delen är ett kortare sätt att säga "lika med eller senare" "inte före", så vi använder !< .

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

Mata den sql sträng till ditt förberedda uttalande. Skicka sedan de två LocalDateTime objekt för platshållarna.

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


  1. Skillnad mellan MySQL/SQLite/etc-databaser?

  2. Hur kontrollerar man privilegierna (DDL,DML,DCL) på objekt som tilldelats Schema, Roller i Oracle Database?

  3. Lägga till fler avancerade funktioner som att hantera kategorier och rösta på trådar och inlägg

  4. Fel räkning av skillnadsdagar mellan 2 dejter med joda-tid?