ТЛ; др
myPreparedStatement
.setObject(
LocalDate.parse( "2019-01-23" )
) ;
DATE
в MySQL только на дату
Тип DATE
в MySQL является значением только для даты, без времени суток и без часового пояса.
Выдержка из Документация по MySQL 8.0 :
Тип DATE используется для значений с частью даты, но без части времени. MySQL извлекает и отображает значения DATE в формате «ГГГГ-ММ-ДД». Поддерживаемый диапазон: от «1000-01-01» до «9999-12-31».
Используйте тип «только дата» в Java для данных, поступающих из типа «только дата» в вашей базе данных. Класс java.util.Date
, который вы пытаетесь использовать, это , а не дата, это момент в UTC, дата с временем суток и смещением от UTC, равным нулю, все отслеживаются как счетчик миллисекунд с первого момента 1970 года в UTC. Неправильное название этого класса является лишь первым из многих неудачных вариантов дизайна, сделанных этими программистами. Вместо этого перейдите к java.time классам. Прекратить использование Date
.
MM
= номер месяца, а не название
Ваш формат "yyyy-MM-dd"
предназначен для числового месяца, а не строки названия месяца, показанной в вашем примере значения 25-March-2019
.
Избегайте устаревших классов даты и времени
Классы SimpleDateFormat
и Date
ужасны, ужасный беспорядок плохого дизайна. Они были вытеснены несколько лет назад с принятием JSR 310, реализованного в классах java.time .
Умные объекты, а не тупые нити
Обменивайтесь объектами с вашей базой данных, где это возможно, а не с текстом.
Начиная с JDBC 4.2, мы можем напрямую обмениваться java.time объектами с базой данных. В качестве значения только для даты, например, для типа DATE
стандарта SQL, используйте класс java.time.LocalDate
.
Видимо, ваши текстовые вводы для значений даты имеют формат ГГГГ-ММ-ДД, который является стандартным ISO 8601 форматом. Классы java.time по умолчанию используют форматы ISO 8601. Поэтому нет необходимости указывать шаблон форматирования.
LocalDate localDate = LocalDate.parse( "2019-01-23" ) ;
myPreparedStatement.setObject( … , localDate ) ;
индексирование.
LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;
localDate.toString (): 2019-01-23
Если вы хотите создать строку, представляющую значение этого объекта LocalDate
в другом текстовом формате, используйте класс DateTimeFormatter
. Поищите переполнение стека для получения дополнительной информации, так как он, как и остальная часть вашего вопроса, уже много раз освещался в переполнении стека. Выполните поиск переполнения стека перед публикацией.
Совет. Обычно лучше использовать PreparedStatement
в своей работе JDBC . Одним из основных преимуществ является предотвращение SQL-инъекций атак безопасности.
О 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 .