我在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
值的预准备语句。
我怎样才能解决这个问题?
答案 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
如果你只需要一个日期输出,我想上面的那个应该有效。