10

我正在尝试将当前日期和时间插入到 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()) + "')"

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

4

6 回答 6

20

根据错误描述,您在数据库中插入了不正确的类型。请参阅JDBC 到 MSSQL。您应该将 Calendar 转换为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();
于 2013-01-28T08:45:55.020 回答
3

首先,不要使用字符串连接。你有没有想过SQL 注入

如何做到这一点的正确方法是使用准备好的语句:

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

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

于 2013-01-28T08:51:36.640 回答
1

dateFormat#format此方法返回格式化字符串而不是Date对象。数据库字段是DateTime并且预计java.sql.Timestamp不会String根据docs插入那里。

为了符合 SQL DATE 的定义,由 java.sql.Date 实例包装的毫秒值必须通过在实例关联的特定时区中将小时、分钟、秒和毫秒设置为零来“规范化” .

在查询中尝试java.sql.Timestamp使用 object 而不是 String,我建议您使用PreparedStatement.

于 2013-01-28T08:43:09.013 回答
0

这是因为您试图将字符串日期值保存到日期类型数据库字段。

将其转换为数据数据类型

您还可以使用日期时间“未分隔”格式yyyymmdd hh:mm:ss

于 2013-01-28T08:43:35.133 回答
0

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

于 2013-01-28T08:57:16.483 回答
0

If you want to store current date and time then you should use MYSQL inbuilt method NOW(). for brief documentation refer http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html . so your code will be like.

INSERT INTO Companies CreatedOn VALUES(NOW())"

However If you want to do it using java Date-util then it should be

Calendar cal = Calendar.getInstance(); 
java.sql.Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
于 2013-01-28T09:13:03.267 回答