PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Какъв трябва да бъде типът на параметъра в Java, когато е клеймо за време без часова зона в postgresql?

tl;dr

За SQL, използващ 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()
) ;

Внимавайте:Предполагам, че използвате грешен тип за вашата колона във вашата база данни. Моментите могат да се проследяват само с TIMESTAMP WITH TIME ZONE , не TIMESTAMP WITHOUT TIME ZONE . Потърсете в Stack Overflow за повече информация.

Нито един момент

Отговорът на Йенс вече е остарял. В наши дни трябва да използвате модерния java.time класове, които изместиха проблемните стари наследени класове за дата-час.

Този тип данни както в Postgres, така и в стандарта SQL нарочно липсва контекстът на отместване от UTC или часова зона. Така че, внимавайте, този тип не може да представлява момент, не е точка от времевата линия.

Не, грешен тип данни. Освен че е наследство и е ужасно дефектен в дизайна, java.sql.Timestamp класът представлява момент, конкретна точка от времевата линия. Така че това е несъответствие с вашата колона от тип TIMESTAMP WITHOUT TIME ZONE .

LocalDateTime

Вместо това трябва да използвате LocalDateTime клас. Този клас представлява дата с час от деня, но му липсва концепция за отместване или часова зона.

За извличане на стойност от базата данни.

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

За да изпратите стойност към базата данни.

myPreparedStatement.setObject( … , ldt ) ;

Начало на деня

Тук имате друго несъответствие. Вие предоставяте стойност само за дата, но вашата колона съдържа стойности за дата с час от деня.

Друг проблем:Вие използвате тъпи низове, където трябва да използвате интелигентни обекти. От JDBC 4.2 можем да обменяме java.time обекти с базата данни. Използвайте PreparedStatement с контейнери и предавайте обекти чрез `set

За да решим проблема с датата с времето на деня, трябва да определим началото на деня. С LocalDateTime , нямаме аномалии в часовата зона, които да отчитаме. Така че денят винаги започва в 00:00 часа. Независимо от това, трябва да си изградим навика да питаме java.time за определяне на началото на деня.

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

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

Напишете си SQL със запазени места.

Предлагам ви да промените начина си на мислене, за да създадете навик за полуотворения подход за дефиниране на интервал от време. В Half-Open началото е включително докато краят е изключителен . Така че за единствения цял ден на 20-ти, потърсете дати, равни на или по-късни от 20-ти и стигащи до, но не включително 21-ви. Що се отнася до тази първа част, по-кратък начин да се каже „равно на или по-късно“ е „не преди“, така че използваме !< .

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

Подайте този sql низ към вашето подготвено изявление. След това предайте двата LocalDateTime обекти за контейнерите.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2.ProgrammingError:не съществува съвпадение на релацията

  2. Изчислете резултата от месечните периодични приходи (MRR) с помощта на postgres

  3. Как да декларирате променлива в PostgreSQL

  4. Експортирайте и импортирайте дъмп на таблица (.sql) с помощта на pgAdmin

  5. Как да включите нулеви стойности в заявка `tablefunc` в postgresql?