Java当前时间戳与Oracle数据库时间列对比问题咨询
问题解答
1. 给定查询语句能否返回正确结果?
不一定,需注意两个核心点:
- 首先确认
emp_updt_timestmp列的类型为TIMESTAMP(而非字符串类型)。如果是TIMESTAMP类型,to_timestamp将传入字符串转换为TIMESTAMP后,与列值的对比逻辑是成立的。 - 你的格式字符串
'dd-mm-yyyy hh.mi.ss AM'未包含毫秒部分,但这不会影响对比——传入时间会默认补0毫秒,若业务逻辑允许忽略毫秒级差异,该查询能正常返回符合条件的结果。
另外需注意:Oracle中hh代表12小时制,搭配AM/PM是正确用法;mm对应数字月份,与你传入的12匹配,这部分格式无问题。
2. 是否必须以此格式传入时间?
完全不必,更推荐的做法是不要直接拼接字符串到SQL中,而是用Java的PreparedStatement绑定TIMESTAMP参数:
// 将系统时间转为java.sql.Timestamp类型 Timestamp currentTime = new Timestamp(System.currentTimeMillis()); // 预编译SQL语句 String sql = "SELECT * FROM emp WHERE emp_updt_timestmp >= ?"; PreparedStatement pstmt = connection.prepareStatement(sql); // 设置参数 pstmt.setTimestamp(1, currentTime); // 执行查询 ResultSet rs = pstmt.executeQuery();
这种方式既规避了格式匹配的繁琐,又能防止SQL注入,还能保证时间类型的精准对比。
如果一定要通过字符串传入,也可选择Oracle支持的其他时间格式,只要to_timestamp的格式字符串与传入字符串完全匹配即可。比如传入带月份缩写的格式'20-DEC-2022 04.02.12 PM',对应格式字符串改为'dd-mon-yyyy hh.mi.ss AM'(注意Oracle的mon为月份缩写,大小写需匹配数据库NLS设置)。
内容的提问来源于stack exchange,提问作者user739115
相关产品推荐
相关产品推荐

