【问题标题】:HSQLDB inserting datetime format for SQL Server throws exceptionHSQLDB 为 SQL Server 插入日期时间格式引发异常
【发布时间】:2020-12-22 01:12:25
【问题描述】:

我正在尝试为我的 SQL Server 查询运行单元测试。查询只是将日期插入表中。我尝试了两种不同的格式,但没有奏效:

parameters.addValue(STUDY_DATE, getDate(studyEvent.getStudy().getStudyDate()));
Timestamp timestamp = new Timestamp(getDate(studyEvent.getStudy().getStudyDate()).getTimeInMillis());
parameters.addValue(STUDY_DATE, timestamp);

这是返回 Calendar 对象的getDate() 方法:

private Calendar getDate(long time) {
    Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
    calendar.setTimeInMillis(time);
    return calendar;
}

我不确定问题是 SQL Server 的日期时间格式问题还是 hsqldb 问题。这是我的 hsqldb 创建表:

SET DATABASE SQL SYNTAX MSS TRUE;

DROP TABLE event_study IF EXISTS;
CREATE TABLE event_study
(
    STUDY_ID INT,
    STUDY_DATE DATE
)

我的 hsqldb 设置错了吗?还是应该为 SQL Server 使用不同的日期时间格式?

我得到的错误是:

数据异常:无效的日期时间格式;嵌套异常是 java.sql.SQLDataException: data exception: invalid datetime format

我正在运行的 SQL 查询是:

INSERT INTO event_study(study_id, study_date)
            SELECT x.*
            FROM (VALUES(:study_id, :study_date))
            AS x(study_id, study_date)
            WHERE NOT EXISTS (SELECT 1 FROM event_study s WHERE s.study_id = x.study_id)

【问题讨论】:

  • 你得到的错误是什么?我们还需要查看实际运行 INSERT 语句的代码(例如,PreparedStatement 是如何创建和执行的))
  • 为什么不使用具有特定数据库类型的SqlParameter 实例(例如:Types.DATE)?

标签: sql-server hsqldb


【解决方案1】:

由于您没有使用字符串作为日期,这实际上不是格式问题,而是 Java 类型问题。使用您的表定义,DATE 没有时间信息。您可以为参数值创建和使用java.sql.Date 对象。如果您需要包含当天时间信息的日期时间列,请在表定义中使用TIMESTAMP,并在参数值中使用java.sql.Timestamp

在任何一种情况下,您都不能使用日历对象作为参数值。

【讨论】:

  • 我有点好奇为什么这适用于 Oracle SQL 设置..
  • 我在参数中创建了Timestamp 对象并将DATE 更改为DATETIME 它可以工作。
  • 不同的 JDBC 驱动程序可能允许不同的附加类型,例如日历。对于 Oracle,DATE 实际上是一种 TIMESTAMP 的别名。将 Timestamp 与 TIMESTAMP 一起使用(DATETIME 是 SQL TIMESTAMP 的别名)应该适用于大多数数据库引擎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多