tl;dr
Dla SQL przy użyciu półotwartego okresu czasu:"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()
) ;
Uwaga:zgaduję, że używasz niewłaściwego typu kolumny w swojej bazie danych. Chwile można śledzić tylko za pomocą TIMESTAMP WITH TIME ZONE
, nie TIMESTAMP WITHOUT TIME ZONE
. Przeszukaj Stack Overflow, aby uzyskać więcej informacji.
Ani chwili
Odpowiedź Jensa jest już przestarzała. W dzisiejszych czasach powinieneś używać nowoczesnego java.time klasy, które zastąpiły kłopotliwe stare, starsze klasy data-czas.
Ten typ danych zarówno w Postgresie, jak iw standardzie SQL celowo nie zawiera kontekstu przesunięcia względem czasu UTC lub strefy czasowej. Uważaj więc, ten typ nie może reprezentować chwili, nie punkt na osi czasu.
Nie, zły typ danych. Poza tym, że jest przestarzały i jest strasznie wadliwy w projekcie, java.sql.Timestamp
klasa reprezentuje moment, konkretny punkt na osi czasu. To jest niezgodność z Twoją kolumną typu TIMESTAMP WITHOUT TIME ZONE
.
LocalDateTime
Zamiast tego powinieneś używać LocalDateTime
klasa. Ta klasa reprezentuje datę z porą dnia, ale nie ma pojęcia o przesunięciu ani strefie czasowej.
Aby pobrać wartość z bazy danych.
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
Aby wysłać wartość do bazy danych.
myPreparedStatement.setObject( … , ldt ) ;
Początek dnia
Masz tu kolejną niezgodność. Podajesz wartość zawierającą tylko datę, ale Twoja kolumna zawiera wartości daty z porą dnia.
Kolejny problem:używasz niemych ciągów znaków tam, gdzie powinieneś używać inteligentnych obiektów. Od JDBC 4.2 możemy wymieniać java.time obiekty z bazą danych. Użyj PreparedStatement
z symbolami zastępczymi i przekaż obiekty przez `zestaw
Aby rozwiązać problem daty z porą dnia, musimy określić początek dnia. Z LocalDateTime
, nie mamy do uwzględnienia żadnych anomalii w strefie czasowej. Tak więc dzień zawsze zaczyna się o 00:00. Niemniej jednak powinniśmy przyzwyczaić się do zadawania pytań java.time aby określić początek dnia.
LocalDate startDate = LocalDate.parse( "2014-11-20" ) ;
LocalDate stopDate = LocalDate.parse( "2014-11-21" ) ;
LocalDateTime start = startDate.atStartOfDay() ;
LocalDateTime stop = stopDate.atStartOfDay() ;
Napisz SQL z symbolami zastępczymi.
Proponuję zmienić swoje myślenie, aby wyrobić w sobie nawyk podejścia półotwartego do definiowania czasu. W Half-Open początek włącznie zakończenie jest wyłączne . Tak więc dla całego dnia 20-go szukaj dat równych 20-mu lub późniejszych i biegnących do, ale nie w tym 21. Jeśli chodzi o tę pierwszą część, krótszym sposobem powiedzenia „równe lub później” jest „nie wcześniej”, więc używamy !<
.
String sql = "SELECT * FROM tbl WHERE when !< ? AND when < ? ; " ;
Podaj ten sql
ciąg do przygotowanego oświadczenia. Następnie przekaż dwa LocalDateTime
obiekty dla symboli zastępczych.
myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;