【问题标题】:SQL insert date into databaseSQL将日期插入数据库
【发布时间】:2013-06-30 09:31:28
【问题描述】:

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

2013 年 6 月 29 日星期六 11:07:25 CDT

当我尝试使用将其插入数据库时​​

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

我明白了

"从字符转换日期和/或时间时转换失败 字符串。”

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

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

【问题讨论】:

  • 参数化了值。

标签: java sql database insert


【解决方案1】:

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

不 - 你应该避免 当前 的字符串转换。您不应该像那样动态构建 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 - 用于时区。这仍然非常不清楚,但希望你能得到你想要的结果。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      或者,使用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();
      

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

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

      【讨论】:

        【解决方案4】:

        您可以使用SimpleDateFormat 来格式化您的日期对象

        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);
        

        【讨论】:

          猜你喜欢
          • 2016-04-22
          • 1970-01-01
          • 2011-04-06
          • 2021-08-31
          • 2014-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多