我正在使用本地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
)
;
答案 0 :(得分:2)
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
)中使用日期时间类型。使用适当的类型而不是仅仅使用字符串可以使代码self-documenting,确保有效值并提供type-safety。
PreparedStatement
和占位符更改您的SQL以将?
占位符与prepared statement一起使用。另外,您将消除SQL-Injection攻击的风险。
在堆栈溢出中搜索类名称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格式。仅将本地化的格式用于呈现给用户,而不能在您的业务逻辑中使用。
通常, java.time 类在生成和解析字符串时默认使用标准格式。
LocalDate.parse( "2019-05-10" ) // May 10, 2019.
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:0)
if you date columns are proper date data type
you should use
'2019/10/05'
or
str_to_date('05/10/2019', '%d/%m/%Y')