2016-09-25 76 views
1

我有一个简单的REST Api暴露几个实体,其中一些实体有日期字段,我想以UNIX时间戳格式存储在H2数据库中。然而,这引起followign例外:'1980-04-08'如何在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', '[email protected]', 'MALE', 'London', 335923000), 
    ... 

此前,它与时间戳的格式如下工作。

这是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批注没有什么关系数据库时间戳格式,但我不知道如何告诉休眠我的时间戳是UNIX格式。

我看过convert unix timestamp to H2 timestamp和H2文档,应支持此标准格式。有人能指出我,我做错了什么?

+0

你使用java.util.Date或java.sql.Date? – mhasan

+0

@mhasan我正在使用java.util.Date – Smajl

+0

您是否尝试过使用'DATE'而不是'TIMESTAMP',因为您的列名称表明它只是一个日期,而不是时间戳? –

回答

0

那么,答案已经以另一种方式here

,你会找到一种方法,代表了毫秒的日期时间没有时区进行的(这是什么是“时间戳”是SQL)

+0

该答案不包括如何在H2数据库中以UNIX时间戳格式存储时间戳 – Smajl

+1

您不能......您正试图使用​​Timestamp sql类型作为数据类型的表示,比如“long”......为什么在这种情况下不直接使用LONG类型或NUMERIC(18)? SQL Timestamp并非您所想象的那样:即使在磁盘上的序列化结束时,数据库肯定会使用类似unix表示的内容,H2 SQL API的前端在文本表示中表示TIMESTAMP = Date + Time +毫秒。所以如果你真的想使用时间戳SQL类型来表示你的Unix时间戳,你必须自己做转换,没有cookie。 – Alex

+0

好的,我决定将它存储为标准文本格式,我试图保存它,像这样:'2016-12-01 20:00'。但是,这导致异常:无法解析“TIMESTAMP”常量“2016-12-01 20:00”。我正在使用DATETIME数据类型。 – Smajl