Java-метод останавливается при получении объекта java.sql.Date из базы данных mysql, почему? - PullRequest
1 голос
/ 17 ноября 2010

Мой класс Java (сервлет) работает нормально, но недавно я заметил проблему.

В моей базе данных есть столбец «Дата» с именем «Full_Expiration_Date». Если он был введен, он будет сохранен как «2010-11-17». Если никто не вошел, это сохраняет его как «0000-00-00».

В моем классе я вызываю записи из базы данных и просматриваю поле 'Full_Expiration_Date', чтобы узнать, есть ли у него дата или нет. Если это произойдет, я выполню несколько строк кода, которые проверяют, не до сегодняшней даты, и если дата НЕ сегодняшняя дата - если оба эти условия выполнены, купон истек.

Таким образом, мой код работает нормально, если указана дата истечения срока действия, но не работает, когда в поле указано «0000-00-00».

Я генерирую массив информации для каждого купона в таблице БД. После завершения проверки и заполнения массива он отправляется в качестве атрибута запроса.

Вот фрагмент моего кода для этого процесса -

rs = stmt.executeQuery("select Full_Expiration_Date from coupons");

//will hold value from "Full_Expiration_Date" field in db
java.sql.Date expirationDate = null;

//today's date - used for comparison
java.util.Date today = new java.util.Date();  

while(rs.next()) {
    //get expiration date from db for this record
    expirationDate = rs.getDate(12);  

    if(expirationDate == null) { //should be if the field is 0000-00-00, right?
       //don't do any checking against
       //expiration date, this record 
       //doesn't have one
       couponList[counter][11] = "";
     } else { //10                         
       if(expirationDate.before(today) & !today.equals(expirationDate)) { 
          couponList[counter][11] = "expired";
           } else { //11
          couponList[counter][11] = "";
       }//if 
     }//if
   counter++;
  }//while   

Может кто-то точно определить, что я здесь делаю не так? После тестирования я уверен, что это связано с тем, что это поле «0000-00-00».

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

0000-00-00 - недопустимая дата, которая не может быть проанализирована Java. Вам нужно разрешить пустые значения в этом поле, чтобы MySQL прекратил вставлять 0, и таким образом ваша проверка if (expirationDate == null) будет фактически работать.

Это глупое поведение IMO, и вы должны "исправить это", включив строгий режим. http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_no_zero_date

2 голосов
/ 17 ноября 2010

Вы можете обойти это, используя свойство конфигурации MySQL «zeroDateTimeBehavior». В настройках вашего соединения установите:

«zeroDateTimeBehavior» в «convertToNull»

Каждый раз, когда извлекается дата 0000-00-00, она возвращает ноль вместо исключения.

Ссылка: http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

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