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 ) ;