TO_DATE问题

时间:2012-02-22 19:50:35

标签: sql oracle to-date

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

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')

产生以下错误"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')

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

我真的只是假设我需要.FF来说明“from”字符串中的.0。我也尝试了.FF1.FF2,...,.FF9,结果相同(此时我正在抓住稻草)。

据我所见,sc_dt字段始终填充了月/日/年部分(而不是小时/分钟/秒部分)。

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

我怎样才能解决这个问题?

5 个答案:

答案 0 :(得分:6)

您需要使用午夜之后的秒数选项。类似的东西:

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

或者这个:

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

答案 1 :(得分:5)

DATE这样的Oracle sc_dt列始终会将日期和时间组件缩减到第二列。根据您的查询工具及其配置方式(通常是会话的NLS_DATE_FORMAT),默认情况下可能没有显示时间组件。但是,您可以通过明确TO_CHAR

来查看时间组件
SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' ) 
  FROM table_name

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

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

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

答案 2 :(得分:3)

我意识到这个帖子已经超过一年了但是...... 扔掉它的另一种选择可能是:

src_dt=select TO_DATE('2011-11-03 00:00:01.1234', 'YYYY-MM-DD HH24:MI:SS.?????') from dual;

注意:有一个额外的'?'投入以说明你甚至可以坚持一些额外的'?'。如果'?'表示的数字在源时间字符串中没有任何相应的字符,则Oracle不会抱怨。如果您不确定接收的秒数的精确度,这可能会有所帮助。

此选项为源时间的“小数秒”格式提供了一定的灵活性。 我不知道这实际上是在任何地方记录的。

答案 3 :(得分:1)

我这样做了:

ALTER SESSION 
SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS.?';


--Change the decimal
ALTER SESSION 
SET NLS_NUMERIC_CHARACTERS = ',.';

它对我有用

答案 4 :(得分:0)

src_dt = select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual

如果你只需要一个日期输出,我想上面的那个应该有效。