PreparedStatement的

时间:2014-10-27 04:18:52

标签: java sql jdbc

我正在使用PreparedStatement的setString方法在sql查询中设置开始日期和结束日期的值。

String sql = "..... " AND tableA.time BETWEEN ? " +
                    " AND ?";

PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, startDate);
st.setString(2, endDate);

但是没有设置值。我明白通常有一个等号:     “tableA.member_id =?” +“

当我在sql语句中使用'Between'运算符时,如何调用setString方法?希望有人可以提供建议。谢谢。

3 个答案:

答案 0 :(得分:2)

请参阅http://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions011.htm

“BETWEEN”可与datetime数据类型一起使用。但是,如果tableA.time是某种日期时间字段(时间戳等),则使用st.setString(...)将不起作用。您需要使用setDate(dt)或setTimestamp(ts)。有关详细信息,请参阅Using setDate in PreparedStatement

答案 1 :(得分:2)

使用 setDate

您的 startDate endDate java.util.Date 对象吗?

如果是,您可以使用此代码。

st.setDate(1, new java.sql.Date(startDate.getTime()));
st.setDate(2, new java.sql.Date(endDate.getTime()));

如果不是。转换第一个ro java.util.Date 对象。

答案 2 :(得分:1)

BETWEEN希望其参数具有与正在测试的列兼容的类型。为日期列提供字符串参数将无法正常工作。

您可以向SQL添加一个函数,以便将字符串转换为日期(我不知道您正在使用的数据库,此示例使用Oracle的to_date函数):< / p>

from tableA.time BETWEEN to_date(?, 'yyyy/mm/dd') AND to_date(?, 'yyyy/mm/dd')

或者,您可以单独保留SQL并在PreparedStatement上使用setDate,例如:

setDate(1, new SimpleDateFormat("yyyy/MM/dd").parse(startDate));

第二种方式更常见,它的优点是可以避免向SQL添加日期转换功能(可能是非标准的)。

但你必须在一方或另一方进行转换。数据库的SQL解析器不会为您转换它。如果数据库负责转换,并且有一个错误,它可能会无声地引入数据错误,那么应用程序开发人员告诉数据库应该如何转换日期字符串的错误就越少。