错误:日期/时间值的字符串表示形式超出范围

时间:2019-05-01 08:36:51

标签: java sql database date db2

我正在使用本地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 个答案:

答案 0 :(得分:2)

tl; dr

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

提示:在将日期时间值序列化为文本时,学习使用标准的ISO 8601格式。仅将本地化的格式用于呈现给用户,而不能在您的业务逻辑中使用。

通常, java.time 类在生成和解析字符串时默认使用标准格式。

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

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 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')