Сравните две даты, полученные из таблицы SQL в Java - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу сравнить две даты, извлеченные из запроса SQL, чтобы узнать, какая из них больше.Формат даты в sql:

2018-11-22 11:12:38.291647

Я пытался использовать

java.util.Date sqlDate=new java.util.Date(resultset.getDate().getTime());

Но он продолжает просить изменить тип данных на int.

Я также пытался использовать

SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
java.util.Date d=df.format(/*date String*/);

Но это тоже не работает.он продолжает просить изменить тип данных d на String.

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Нет «формата» в базе данных

Формат даты в sql: 2018-11-22 11: 12: 38.291647

Нет, это не так.

Значения даты и времени, хранящиеся в типах даты и времени, не имеют «формата».Форматы для строк.База данных хранит значение даты и времени в собственной внутренней структуре данных.Детали этой структуры данных не относятся к нашей сфере деятельности.

Умные объекты, а не тупые строки

Обмен объектами даты и времени класса даты и времени с базой данных для значений, хранящихся в датестолбец

Начиная с JDBC 4.2, мы можем обмениваться java.time объектами с базой данных.Больше не нужно использовать эти ужасные классы, такие как java.sql.Timestamp, java.sql.Date, java.util.Date и java.util.Calendar.

На мгновение в базе данных используется столбец типа, похожего на стандарт SQL TIMESTAMP WITH TIME ZONE.

OffsetDateTime

Для такого столбца передайте объект OffsetDateTime в подготовленный оператор.Обычно лучше всего работать в UTC.

Instant instant = Instant.parse( "2018-11-22T11:12:38.291647Z" ) ;  // `Z` on the end means UTC. Pronounced “Zulu”.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

Извлечение.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Сравнить

Сравнить OffsetDateTime объектов с использованием isBefore, isAfter и isEqual.

boolean aIsBeforeThanB = odtA.isBefore( odtB );

О java.time

Создан фреймворк java.time в Java 8 и позже.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 26 ноября 2018

Сначала преобразуйте в Date объекты:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.sss");
Date date = format.parse(yourDate);

, а затем сравните их, используя Date.after или Date.before

0 голосов
/ 26 ноября 2018

Этот тип формата сопоставим в java, сравнивая строки, поэтому вам не нужно конвертировать:

String date1 = "2018-11-22 11:12:38.291647";
String date2 = "2018-11-23 10:11:00.090600";
int result = date1.compareTo(date2);

System.out.println(result);

напечатает

-1

потому что date2 "больше" чем date1.если date1 «больше», чем date2, результат равен 1 иесли date1 равно "1015 *, результат равен 0

0 голосов
/ 26 ноября 2018

Вы можете заказать результат запроса в SQL с помощью команды ORDER BY.Если вы хотите "самую большую" дату, вы должны заказать запрос по убыванию: ORDER BY DESC.

Таким образом, вы можете получить наибольшую дату из объекта ResultSet, содержащего результат вашего запроса, просто извлекая первый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...