HSQLDB 为 SQL 服务器插入日期时间格式引发异常

HSQLDB inserting datetime format for SQL Server throws exception

我正在尝试 运行 对我的 SQL 服务器查询进行单元测试。查询只是将日期插入 table。我尝试了两种不同的格式,但没有成功:

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

这是 returns 日历对象的 getDate() 方法:

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

我不确定问题是 SQL 服务器的日期时间格式问题还是 hsqldb 问题。这是我的 hsqldb 创建 table:

SET DATABASE SQL SYNTAX MSS TRUE;

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

我的hsqldb设置有误吗?或者我应该为 SQL 服务器使用不同的日期时间格式?

我得到的错误是:

data exception: invalid datetime format; nested exception is java.sql.SQLDataException: data exception: invalid datetime format

和SQL查询我是运行ning是:

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)

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

无论哪种情况,您都不能使用日历对象作为参数值。