PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jaki powinien być typ parametru w Javie, gdy jest to znacznik czasu bez strefy czasowej w postgresql?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź i zsumuj zakresy dat z nakładającymi się rekordami w postgresql

  2. Przygotowane oświadczenie na temat Postgresql w Rails

  3. ActiveRecord::StatementInvalid. Błąd PG

  4. Przywracanie i przywracanie Pgbackrest Delta

  5. Konwertuj uniksowy znacznik czasu na znacznik czasu bez strefy czasowej