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值的预准备语句.
我怎么能绕过这个?
您需要使用午夜过后的秒数选项.就像是:
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)
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语句中处理字符串格式.