Sql 最新问题
我的SQLWHERE子句中包含以下内容。这是针对Oracle数据库运行的。Sql 最新问题,sql,oracle,to-date,Sql,Oracle,To Date,我的SQLWHERE子句中包含以下内容。这是针对Oracle数据库运行的。sc_dt字段在数据库中定义为日期字段 sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD') 产生以下错误“日期格式图片在转换整个输入字符串之前结束” 当我尝试用以下公式解释小数秒(.0在本例中)时,我得到了以下错误 sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF') 产生以下错
sc_dt
字段在数据库中定义为日期字段
sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')
产生以下错误“日期格式图片在转换整个输入字符串之前结束”
当我尝试用以下公式解释小数秒(.0
在本例中)时,我得到了以下错误
sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF')
产生以下错误“无法识别日期格式”
我只是假设我需要.FF
来解释“from”字符串中的.0
。我也尝试过.FF1
,.FF2
,…,.FF9
,也得到了同样的结果(此时我正在抓救命稻草)
就我所见,sc_dt
字段总是填充月/日/年部分(而不是小时/分钟/秒部分)
我正在调试一个java程序,该程序正在执行上述SQL语句,并带有2011-11-03 00:00:00.0
值
我该如何解决这个问题呢?src\u dt=
从dual中选择截止日期('2011-11-03 00:00:01.1','YYYY-MM-DD HH24:MI:SS.sss')
如果您只需要一个日期输出,我想上面的方法应该可以使用。您需要使用午夜后秒选项。比如:
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
Oracle的
DATE
列(如sc_dt
)总是包含一天和一个时间部分,一直到第二天。根据您的查询工具及其配置方式(通常是会话的NLS\u DATE\u格式
),默认情况下可能不会显示时间组件。但是,您可以通过对字符执行显式的TO\u CHAR
SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' )
FROM table_name
由于日期
仅将时间存储到秒,因此不能在格式掩码中使用小数秒。因此,您需要执行类似的操作来提取字符串的部分,直到小数秒。如果不能保证字符串始终位于小数点前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语句中的字符串格式 我知道这条线已经有一年多了,但是。。。
另一种选择可能是:
src_dt=select TO_DATE('2011-11-03 00:00:01.1234', 'YYYY-MM-DD HH24:MI:SS.?????') from dual;
注意:这里有一个额外的“?”来说明你甚至可以加入几个额外的“?”。如果由“?”表示的数字在源时间字符串中没有任何对应字符,则Oracle不会对此提出投诉。如果您不确定接收到的秒数的精度,这可能会有所帮助
此选项为源时间的“分数秒”格式提供了一些灵活性。
我不知道这实际上在任何地方都有记录。我这样做了:
ALTER SESSION
SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS.?';
--Change the decimal
ALTER SESSION
SET NLS_NUMERIC_CHARACTERS = ',.';
这对我来说很管用你,善良的先生,洛克。我几个小时前就该问这个问题了!(一旦堆栈溢出,我就会接受这个答案)。非常感谢!是的,.FF将只在TO_TIMESTAMP函数上工作,而不是在TO_DATE上工作。请注意,TO_DATE调用仅在字符串中标识小数秒的部分恰好也是自午夜起的秒数(每小时可能只发生9次)时才工作。如果你的时间总是在午夜,那可能不是问题。但一般来说,您将得到
ORA-01838:seconds of minute与seconds in day冲突错误。而TO_TIMESTAMP
调用可能会导致性能问题,如果它强制执行隐式强制转换,从而阻止使用索引。没有sir。只需将第一个示例更改为'00:00:01.2'(any!=1而不是2)并查看失败。此to_DATE调用仅在字符串中标识小数秒的部分恰好也是自午夜起的秒数(每小时可能只发生9次)时才有效。如果你的时间总是在午夜,那可能不是问题。但总的来说,你会得到ORA-01838:seconds of minute与seconds in day的错误冲突。我喜欢Justin使用SUBSTR
的解决方案,比其他使用.ssssss
格式模型的解决方案更好,这两个原因都是他在对其他答案的评论中给出的,因为更清楚的是,时间的分数秒部分被丢弃了。@Justin-谢谢你的解释!这有助于我理解为什么要这么做。@Justin:不使用setDate的一个原因是Java和数据库之间发生的隐式时区转换。@kevincline-我不确定我是否理解。Oracle日期
没有关联的时区。一个Java.sql.Date就可以了。PreparedStatement
类的setDate
方法使用JVM的默认时区或传入的日历中指定的时区将Java日期转换为Oracle日期。无论哪种方式,似乎都比在传递给Oracle的sting中完全丢弃时区信息要好。@Justin:java.sql.Date没有时区。从1970年1月1日格林威治标准时间00:00开始偏移了一毫秒。JVM时区在全球范围内提供服务的系统上没有用处。数据库也有一个时区。这都是难以置信的粘性。看见