SQL将日期插入数据库

时间:2013-06-29 17:13:58

标签: java sql database insert

我使用java.util.Date来获取日期,我得到的日期格式就像这样

  

Sat Jun 29 11:07:25 CDT 2013

当我尝试使用

将其插入数据库时
String QueryString = "INSERT INTO db (day) Values ('"+d+"');";
    st.executeUpdate(QueryString);

我明白了

  

“从字符转换日期和/或时间时转换失败   字符串“

如何将这种类型的日期插入数据库?

我应该将其声明为字符串吗?

4 个答案:

答案 0 :(得分:4)

  

如何将这种类型的日期插入数据库?我应该将其声明为字符串吗?

不 - 你甚至应该避免目前所拥有的字符串转换。你不应该像那样动态地构建你的SQL - 它是SQL注入攻击,难以阅读的代码和转换失败的秘诀。

而是使用PreparedStatement并使用setDate设置参数:

// TODO: Closing the statement cleanly in a finally block or try-with-resources
PreparedStatement pst = conn.prepareStatement("INSERT INTO db (day) Values (?)");
pst.setDate(1, new java.sql.Date(d.getTime()));
pst.executeUpdate();

请注意java.sql.Datejava.util.Date的子类,但它们有些不同。我从来不清楚哪个时区用于将给定的时刻转换为实际日期 - 并且文档不太有用。在我看来,它被设计打破了,但这是另一回事。您可以使用另一个setDate重载,该重载接受Calendar - 用于时区。它仍然非常不清楚,但希望你能得到你想要的结果。

答案 1 :(得分:1)

使用java.sql.Date与数据库兼容

答案 2 :(得分:0)

或者,使用updatable ResultSet

ResultSet rs = conn.createStatement("select day from db", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs.moveToInsertRow();
rs.updateDate(1, yourJavaSqlDateObject);
rs.insertRow();
rs.first();

但是,根据您的驱动程序/数据库,表上可能存在写锁定。

日期格式应该在输出上完成,而不是输入。让数据库决定如何最好地存储日期。

答案 3 :(得分:0)

您可以使用SimpleDateFormat格式化Date对象

Date d = Calendar.getInstance().getTime(); //Your date

String dateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d);

String QueryString = "INSERT INTO db (day) Values ('"+dateString+"');";
st.executeUpdate(QueryString);