2016-09-25 513 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