TO_DATE问题

ace*_*ger 7 sql oracle to-date

我在SQL where子句中有以下内容.这是针对Oracle数据库运行的.该sc_dt字段在db中定义为日期字段.

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')
Run Code Online (Sandbox Code Playgroud)

产生以下错误 "date format picture ends before converting entire input string"

当我尝试使用以下内容考虑小数秒(.0在本例中)时,我得到以下错误.

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF')
Run Code Online (Sandbox Code Playgroud)

产生以下错误 "date format not recognized"

我真的只是假设我需要.FF考虑的.0,在"从"字符串.我也试过.FF1,.FF2...,.FF9具有相同的结果(我在抓救命稻草在这一点).

据我所知,该sc_dt字段总是填充月/日/年部分(而不是小时/分钟/秒部分).

我正在调试一个java程序,它正在执行上面的SQL作为带有2011-11-03 00:00:00.0值的预准备语句.

我怎么能绕过这个?

nor*_*ole 6

您需要使用午夜过后的秒数选项.就像是:

select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual
Run Code Online (Sandbox Code Playgroud)

或这个:

select TO_TIMESTAMP('2011-11-03 00:00:00.1', 'YYYY-MM-DD HH24:MI:SS.FF') from dual
Run Code Online (Sandbox Code Playgroud)

  • 请注意,TO_DATE调用仅在标识小数秒的字符串部分恰好也是自午夜以来的秒数(每小时可能只发生9次)时才起作用.如果您的时间总是在午夜,那可能不是问题.但总的来说,你会得到'ORA-01838:几秒钟的冲突与白天的秒'错误.如果强制执行隐式强制转换以阻止索引被使用,那么`TO_TIMESTAMP`调用可能会导致性能问题. (4认同)
  • ya,.FF仅适用于TO_TIMESTAMP函数,而不适用于TO_DATE. (2认同)

Jus*_*ave 5

DATE像Oracle这样的列sc_dt总是会有一天和一个时间组件到第二列.根据您的查询工具及其配置方式(通常是会话NLS_DATE_FORMAT),默认情况下可能没有显示时间组件.但是,您可以通过显式查看时间组件TO_CHAR

SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' ) 
  FROM table_name
Run Code Online (Sandbox Code Playgroud)

DATE但是,因为只将时间存储到第二个,所以不能在格式掩码中使用小数秒.所以你需要做这样的事情来提取字符串的一部分直到小数秒.如果你不能保证字符串在小数点之前总是19个字符,你也可以使用INSTR它来查找小数点并在此之前采取一切.

TO_DATE( substr('2011-11-03 00:00:00.0', 1, 19), 'YYYY-MM-DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

但是,由于这是来自Java应用程序,因此使用正确的数据类型会更好.如果使用预setDate准备语句上的方法绑定Java日期(java.sql.Date)而不是绑定字符串,则不必在SQL语句中处理字符串格式.

  • 我喜欢Justin的解决方案,其中`SUBSTR`优于使用`.SSSSS`格式模型的其他解决方案,这两者都是出于他在其他答案的评论中给出的原因,并且因为更清楚的是,时间的第二小部分是被丢弃. (2认同)