如何在H2数据库中存储时间戳

5

我有一个简单的REST Api,其中暴露了几个实体,其中一些实体具有日期字段,我想将它们以UNIX时间戳格式存储在H2数据库中。然而,这会导致以下异常:

Caused by: org.h2.jdbc.JdbcSQLException: Cannot parse "TIMESTAMP" constant "335923000"; SQL statement:
INSERT INTO people (person_id, first_name, last_name, email, gender, location, date_birth) VALUES 
    ('1', 'Peter', 'Smith', 'peter@hotmail.com', 'MALE', 'London', 335923000),
    ...

以前,它使用以下格式的时间戳:'1980-04-08'

这是SQL表定义:

CREATE TABLE people (
    person_id BIGINT PRIMARY KEY auto_increment,
    first_name VARCHAR(32),
    last_name VARCHAR(32),
    email VARCHAR(128) UNIQUE,
    gender VARCHAR(8),
    location VARCHAR(32),
    date_birth TIMESTAMP,
);

我的映射对象(省略不必要的细节):
@Entity
@Table(name = "people")
@Getter
@Setter
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "person_id")
    private long id;

    ...

    @Column(name = "date_birth")
    @JsonFormat(pattern = "YYYY-MM-dd")
    private Date dateOfBirth;

    ...
}

我认为@JsonFormat注解与数据库时间戳格式无关,但我不确定如何告诉Hibernate我的时间戳是UNIX格式。

我查看了将UNIX时间戳转换为H2时间戳和H2文档,应该支持这种标准格式。请问有人能指出我做错了什么吗?


你是使用 java.util.Date 还是 java.sql.Date? - mhasan
@mhasan 我正在使用 java.util.Date - Smajl
1
你试过使用DATE而不是TIMESTAMP吗?因为你的列名表明它只是一个日期,而不是时间戳。 - Usagi Miyamoto
1个回答

1

好的,答案已经以另一种方式在这里给出。

你会找到一种表示毫秒级时间戳且没有时区的方法(这就是 SQL 中的“时间戳”)。


1
该答案未涵盖如何在H2数据库中以UNIX时间戳格式存储时间戳的内容。 - Smajl
1
你正在尝试使用Timestamp SQL类型作为某种类似于“long”的数据类型的表示方式,为什么不直接在这种情况下使用LONG类型或NUMERIC(18)? SQL Timestamp并不是你想象的那样:即使在磁盘上的序列化结束时,数据库肯定会使用类似于Unix表示的东西,但H2 SQL API的前端表示TIMESTAMP = Date+Time+Milliseconds的文本表示。因此,如果你真的想使用Timestamp SQL类型来表示Unix时间戳,你必须自己进行转换,没有捷径。 - Alex
好的,我决定将其存储为标准文本格式,并尝试以以下方式保存:'2016-12-01 20:00'。然而,这会导致异常:无法解析“TIMESTAMP”常量“2016-12-01 20:00”。我正在使用DATETIME数据类型。 - Smajl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接