ошибка: строковое представление значения даты / времени выходит за пределы диапазона - PullRequest
0 голосов
/ 01 мая 2019

Я работаю с локальной базой данных Java и продолжаю сталкиваться с этой ошибкой при попытке вставить дату в таблицу базы данных

Ошибка

Код ошибки 30000, состояние SQL 22007: строковое представление значения даты / времени выходит за пределы диапазона

Запрос

INSERT INTO
   conference (titre, institut_organisatrice, date_conf, date_limite_soumission, date_limite_inscription, montant, frais_inscrit_pro, frais_inscrit_acadm, frais_inscrit_etud, idpresident) 
VALUES
   (
      'Smart Tunisia', 'ministere de la recherche scientifique', '05/10/2019', '20/09/2019', '20/09/2019', 300, 200, 150, 50, 1
   )
;

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

ТЛ; др

myPreparedStatement                                   // Use a prepared statement for most of your SQL work, to pass objects in your JDBC code. Bonus: Doing so avoids SQL-injection attacks too.
.setObject(                                           // Replace a `?` placeholder in your SQL statement.
    … ,                                               // Specify which `?` placeholder.
    LocalDate.parse(                                  // Use `LocalDate` class for a date-only value without time-of-day and without time zone.
        "05/10/2019" , 
        DateTimeFormatter.ofPattern( "MM/dd/uuuu" )   // Specify a formatting pattern to match your input string.
    )
)

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

Для значений даты и времени используйте типы даты и времени в SQL (DATE) и Java (LocalDate). Использование соответствующих типов вместо простых строк делает ваш код самодокументирующимся , обеспечивает допустимые значения и обеспечивает type-safety .

PreparedStatement и заполнители

Измените ваш SQL, чтобы использовать ? заполнителей с подготовленным оператором . В качестве бонуса вы исключите риск SQL-инъекций атак.

Поиск переполнения стека для имени класса PreparedStatement, чтобы узнать больше. Это уже освещалось много раз.

LocalDate

Парсит ваши строковые данные как LocalDate объекты.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ); 
LocalDate ld = LocalDate.parse( "05/10/2019" , f ) ;

Укажите значения для заполнителей.

myPreparedStatement.setObject( … , ld ) ;

При извлечении из столбца DATE в базе данных.

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

ISO 8601

Совет. Научитесь использовать стандартные форматы ISO 8601 при сериализации значений даты и времени в виде текста. Используйте локализованные форматы только для представления пользователю, а не внутри своей бизнес-логики.

Удобно, что классы java.time по умолчанию используют стандартные форматы при генерации и разборе строк.

LocalDate.parse( "2019-05-10" )  // May 10, 2019. 

О java.time

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

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

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

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

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

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

0 голосов
/ 01 мая 2019

если у вас в столбцах даты правильный тип данных даты
вы должны использовать

'2019/10/05'   

или

str_to_date('05/10/2019', '%d/%m/%Y') 
...