Java:插入表日期时间数据
我试图在MS-SQL数据库中插入一个变量当前的日期和时间。 我用这种格式:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Calendar cal = Calendar.getInstance(); System.out.println(dateFormat.format(cal.getTime()));
我得到了这个结果2013-01-28 09:29:37.941
我在数据库中的字段是定义datetime
,正如我在其他具有相同字段的表中看到的那样,日期和时间的编写方式与2011-07-05 14:18:33.000完全相同。
我尝试使用我在java程序中执行的查询插入数据库,但是我收到此错误
SQLexception:状态:S0003消息:将varchar数据类型转换为值的日期时间数据类型超出范围。 错误:242
我的查询是这样的:
query = "INSERT INTO Companies CreatedOn"+ "VALUES ('" + dateFormat.format(cal.getTime()) + "')"
但我不明白我做错了什么。
根据错误描述 ,您将向数据库中插入不正确的类型。 请参阅JDBC到MSSQL 。 您应该将日历转换为时间戳 。
尝试使用:
PrepareStatement statement = connection.prepareStatement("INSERT INTO Companies CreatedOn VALUES(?)"); java.sql.Timestamp timestamp = new java.sql.Timestamp(cal.getTimeInMillis()); statement.setTimestamp(1, timstamp); int insertedRecordsCount = statement.executeUpdate();
首先,不要使用字符串连接。 您是否对SQL注入感到满意 ?
正确的方法是如何使用预备语句:
想法是您使用占位符定义语句,而不是为这些占位符定义值。
有关详细信息,请参阅@Taky的回答。
dateFormat#format
此方法返回格式化字符串而不是Date
对象。 数据库字段是DateTime
,它期望在那里插入java.sql.Timestamp
而不是根据docs的 String
。
为了符合SQL DATE的定义,java.sql.Date实例包含的毫秒值必须通过在与实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“标准化”。 。
在查询中尝试使用java.sql.Timestamp
对象而不是String,我建议您使用PreparedStatement
。
这是因为您尝试将字符串日期值保存到日期类型DB字段。
将其转换为Data dataType
您还可以使用datetime “unseparated”格式yyyymmdd hh:mm:ss
您可以使用Joda框架来处理日期/时间。 它将自己的日期/时间类型映射到Hibernate / SQL类型没有问题。 当您在HQL查询中设置参数时,joda会进行正确的类型映射。
如果你想存储当前的日期和时间,那么你应该使用MYSQL内置方法NOW() 。 有关简要文档,请参阅http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html 。 所以你的代码就像。
INSERT INTO Companies CreatedOn VALUES(NOW())"
但是如果你想使用java Date-util来做它应该是
Calendar cal = Calendar.getInstance(); java.sql.Timestamp timestamp = new Timestamp(cal.getTimeInMillis());