Java:插入表日期时间数据

时间:2013-01-28 08:38:57

标签: java sql sql-server datetime jdbc

我试图在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程序中执行的查询插入数据库,但是我收到此错误

  

SQL异常:状态:S0003消息:varchar的转换   数据类型为日期时数据类型的值超出范围。错误   :242

我的查询是这样的:

query = "INSERT INTO Companies CreatedOn"+ 
         "VALUES ('" + dateFormat.format(cal.getTime()) + "')"

但我不明白我做错了什么。

6 个答案:

答案 0 :(得分:17)

根据error description,您在数据库中插入了错误的类型。见JDBC to MSSQL。您应该将日历转换为Timestamp

尝试使用:

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

答案 1 :(得分:3)

首先,不要使用字符串连接。你对SQL injection感到满意吗?

正确的方法是使用预备语句:

想法是您使用占位符定义语句,而不是为这些占位符定义值。

有关详细信息,请参阅@Taky'的答案。

答案 2 :(得分:1)

dateFormat#format此方法返回格式化字符串而非Date对象。数据库字段为DateTime,根据docs,期望java.sql.Timestamp插入String而不是java.sql.Timestamp

  

符合SQL DATE的定义,即毫秒值   由java.sql.Date实例包装必须通过设置'规范化'   小时,分钟,秒和毫秒为零   与实例关联的特定时区。

在查询中尝试使用PreparedStatement对象而非String,我建议您使用{{1}}。

答案 3 :(得分:0)

这是因为您正在尝试将字符串日期值保存到日期类型DB字段。

将其转换为Data dataType

您还可以使用datetime“未分隔”格式yyyymmdd hh:mm:ss

答案 4 :(得分:0)

您可以使用Joda框架来处理日期/时间。 它将自己的日期/时间类型映射到Hibernate / SQL类型没有问题。 当您在HQL查询中设置参数时,joda会进行正确的类型映射。

答案 5 :(得分:0)

如果您想存储当前日期和时间,则应使用 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());