【问题标题】:Oracle Prepared Statement - ORA-01821: date format not recognizedOracle Prepared Statement - ORA-01821:日期格式无法识别
【发布时间】:2014-01-16 08:10:25
【问题描述】:

我目前正在尝试将日期插入到我的本地 Oracle 数据库中,插入是在使用通配符的 java JAR 文件中编写的。如果我将日期发送为 null,则 INSERT 有效,但是当我尝试发送日期时,我收到以下错误:

ORA-01821: date format not recognized

我已经运行了两个 SQL 命令:

SELECT PARAMETER, VALUE FROM v$nls_parameters;

SELECT CURRENT_TIMESTAMP FROM DUAL;

返回此数据:

PARAMETER                                                        VALUE                                                          
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE                                                     ENGLISH                                                          
NLS_TERRITORY                                                    UNITED KINGDOM                                                   
NLS_CURRENCY                                                     £                                                                
NLS_ISO_CURRENCY                                                 UNITED KINGDOM                                                   
NLS_NUMERIC_CHARACTERS                                           .,                                                               
NLS_CALENDAR                                                     GREGORIAN                                                        
NLS_DATE_FORMAT                                                  DD-MON-RR                                                        
NLS_DATE_LANGUAGE                                                ENGLISH                                                          
NLS_CHARACTERSET                                                 AL32UTF8                                                         
NLS_SORT                                                         BINARY                                                           
NLS_TIME_FORMAT                                                  HH24.MI.SSXFF                                                    
NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH24.MI.SSXFF                                          
NLS_TIME_TZ_FORMAT                                               HH24.MI.SSXFF TZR                                                
NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH24.MI.SSXFF TZR                                      
NLS_DUAL_CURRENCY                                                €                                                                
NLS_NCHAR_CHARACTERSET                                           AL16UTF16                                                        
NLS_COMP                                                         BINARY                                                           
NLS_LENGTH_SEMANTICS                                             BYTE                                                             
NLS_NCHAR_CONV_EXCP                                              FALSE                                                            

 19 rows selected 

CURRENT_TIMESTAMP                  
------------------------------------
16-JAN-14 08.03.06.437000000 EUROPE/ 
LONDON   

查看上面的数据后,我尝试修改我准备好的语句以匹配显示的时间戳:

TO_TIMESTAMP(?,'DD-MON-RR HH24.MI.SSXFF TZR')

TO_TIMESTAMP(?,'DD-MON-RR HH24.MI.SSXFF')

在哪里?是我使用 java 传入的通配符值,即interaction.getStartDate();

有谁知道如何找到正确的格式或我哪里出错了?这几天上网查了一下,一脸懵。

【问题讨论】:

  • 为什么需要日期格式?日期格式用于字符串和日期之间的转换。
  • 我无法控制数据库设置,并且该字段已设置为 TIMESTAMP
  • 数据库中已有日期,其中之一的示例是:17-JUL-13 15.31.07.000000000
  • 但是 JDBC 驱动程序应该处理这个问题。您只需绑定一个 java.util.Date 或 java.sql.Date 对象(或 java.sql.Timestamp,如果您需要几分之一秒),JDBC 驱动程序应将其映射到正确的 SQL 语句。顺便说一句,您的示例 (17-JUL-13 15.31.07.000000000) 没有显示时间戳是如何存储的,只是在您获取时间戳时它们是如何呈现的(作为一个字符串)。
  • @MrBackend: java.util.Date 无法绑定。 java.sql.Date 是没有时间的日期,java.sql.Timestamp 是日期和时间。不过,我同意这是正确的解决方案。

标签: java sql date oracle11g wildcard


【解决方案1】:

经过一些测试,我得到了正确存储到数据库中的日期。我在 TO_TIMESTAMP 调用中使用的日期格式是 'DD-Mon-RRRR HH:MI:SS PM',完整插入如下所示:

TO_TIMESTAMP(?,'DD-Mon-RRRR HH:MI:SS PM')

【讨论】:

  • 找到所需的格式我 System.out.printed 我的对象中日期的字符串值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多