с использованием типа даты в java

Я пытаюсь получить две даты из SQL-запроса и сравнить их. Так что, чтобы сравнить их, я считаю, что мне нужно будет использовать тип «Дата». Вот что я пытаюсь сделать, я знаю, что получаю дату из resultSet неправильно, но я не уверен, как это сделать.

Date validDate = new Date(0);
Date currentDate = new Date(0);

// query

    if (result.next()) {

    validDate  = (result.getObject("validDate")!=null)?result.getObject("validDate").toDate():"";
    currentDate = (result.getObject("currentDate")!=null)?result.getObject("currentDate").toDate():"";
}

if (currentDate > validDate) {
    //do something
}

Опять же, это была моя попытка, но я не могу заставить ее работать. Заранее спасибо.

РЕДАКТИРОВАТЬ: запрос имеет TO_CHAR (столбец, 'MM-DD-YYYY') для двух получаемых мной дат.


person Dan    schedule 14.11.2011    source источник
comment
Вы можете показать нам, где вы получаете результат? Также, возможно, пример того, как выглядит result.getObject (validDate).   -  person Mike Lentini    schedule 14.11.2011
comment
java.util API даты и времени и их API форматирования SimpleDateFormat устарели и подвержены ошибкам. Рекомендуется полностью отказаться от них и перейти на современный Date-Time API. Проверьте этот ответ и этот ответ, чтобы узнать, как использовать java.time API с JDBC.   -  person Arvind Kumar Avinash    schedule 09.07.2021


Ответы (6)


РЕДАКТИРОВАТЬ: теперь вы упомянули, что ваш запрос преобразует дату в строку, прекратите это делать. В конечном итоге вы будете повторно анализировать его на вызывающей стороне - так зачем же бессмысленно выполнять два преобразования? Сведите преобразование строк к абсолютному минимуму - по возможности используйте наиболее подходящий тип данных.


Исходный ответ

Вы не показали, что такое result, но, вероятно, вам нужно что-то вроде _ 2_, чтобы получить значения даты.

Обратите внимание, что ваш код сравнения не будет работать, потому что нет > для Date - вам понадобится что-то вроде:

if (currentDate.after(validDate))

Или получите базовое количество миллисекунд:

if (currentDate.getTime() > validDate.getTime())

Кроме того:

  • Вы не можете присвоить "" переменной Date - строка не является Date.
  • Вы можете просто вызвать ResultSet.getDate() и проверить, равно ли возвращаемое значение null, вместо того, чтобы сначала вызывать getObject, а затем затем getDate()
person Jon Skeet    schedule 14.11.2011

Попробуйте currentDate.after (validDate)

person Marc Van Daele    schedule 14.11.2011

Для сравнения дат я всегда использую методы Date до и после.

person Klaasvaak    schedule 14.11.2011

При доступе к датам с помощью метода getObject могут происходить неприятные вещи. Вам следует попробовать использовать методы rs.getTimestamp (с информацией о времени) или rs.getDate (без информации о времени).

Также из-за довольно сложной иерархии Date-объектов сравнивать даты следует только с помощью метода date1.compareTo(date2) > 0.

person Jonathan    schedule 14.11.2011

если ваш объект результата - ResultSet, тогда

Date validDate = result.getTimestamp("validDate"); 
Date currentDate= result.getTimestamp("currentDate"); 
// you can add null checks here too....
// you can also use if (currentDate.getTime() > validDate.getTime()){}
if (currentDate.before(validDate)) { 
 //some code inhere...
}
person Daniel    schedule 14.11.2011

В вашем коде есть как минимум три ошибки:

  • "" является String литералом, поэтому вы не можете использовать его в своих тернарных выражениях для присвоения переменной типа Date - вместо этого используйте null, чтобы тернарные выражения вам не понадобились.
  • ResultSet.getObject() возвращает Object, у которого нет метода toDate(). Вместо этого просто используйте ResultSet.getDate()
  • Вы не можете сравнивать Date экземпляры с помощью оператора >. Вы должны использовать методы before() и after() класса Date.

Взяв все это вместе, следующий код может работать:

Date validDate = new Date(0);
Date currentDate = new Date(0);

if (result.next()) {
    validDate  = result.getDate("validDate");
    currentDate = result.getDate("currentDate");
}
if (currentDate.after(validDate)) {
    //do something
}

Однако в предложение if может потребоваться дополнительная логика для работы со значениями null. Лучше сделать это, чем оставлять это на усмотрение неявных преобразований.

person Michael Borgwardt    schedule 14.11.2011