8

我的 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考虑.0“来自”字符串中的 。我也尝试过.FF1, .FF2, ....FF9得到相同的结果(此时我正在抓住稻草)。

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

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

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

4

5 回答 5

7

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

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
于 2012-02-22T19:54:34.007 回答
5

像这样的 OracleDATEsc_dt总是有一个日期和一个时间组件,一直到秒。根据您的查询工具及其配置方式(通常是会话的NLS_DATE_FORMAT),默认情况下可能不显示时间组件。但是,您可以通过执行显式来查看时间组件TO_CHAR

SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' ) 
  FROM table_name

但是,因为 aDATE仅将时间存储到秒,所以您不能在格式掩码中使用小数秒。所以你需要做这样的事情来提取字符串的一部分直到小数秒。如果您不能保证字符串在小数点前始终为 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 语句中的字符串格式。

于 2012-02-22T20:04:36.027 回答
3

我意识到这个线程已有一年多的历史了,但是......将其放入的另一个选择可能是:

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

注意:有一个额外的“?” 扔进去是为了说明你甚至可以多加几个'?'。如果“?”表示的数字在源时间字符串中没有任何对应的字符,Oracle 不会提出任何投诉。如果您不确定收到的秒数精度,这可能会有所帮助。

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

于 2014-04-14T14:26:38.440 回答
1

我这样做了:

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


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

它对我有用

于 2014-11-16T15:44:23.160 回答
0

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

如果您只需要日期输出,我想上面的应该可以工作。

于 2012-02-22T19:54:05.963 回答