如何通过jdbc在PostgreSQL中写入基督之前的时间戳?

时间:2014-01-19 12:28:12

标签: java postgresql jdbc timestamp

我试图用PreparedStatement在PostgreSQL中写下基督之前的日期而失败了。 这有什么窍门吗?

Postgres的场地是没有时区的TIMESTAMP。

当我尝试通过像Statement这样的insert into public.tstest1(ts1) values('"2014-01-11 14:00:08.354 BC"')将其写为字符串时 - 它可以正常工作。 但是我不能用普通的ResultSet正确地检索它 - 它失去了“BC”部分并错误地显示了几天或一年 - 无论如何 - 它在Anno Domini AD中有效。

我使用SimpleDateFormat检查了我在2014年BC java.sql.Timestamp准备new Timestamp(-2014-1900+1, 01, 01, 01, 01, 01, 01)之后的输出中的BC日期。

但写入数据库后无法实现相同的目标。

    PreparedStatement pstmt = conn.prepareStatement("INSERT INTO public.tstest1(ts1) VALUES (?)");        

    Timestamp tsBC = new Timestamp(-2014-1900+1, 01, 01, 01, 01, 01, 01);
    Date dt1 = new Date(tsBC.getTime());
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm z G");
    System.out.println(sdf.format(dt1));

    pstmt.setTimestamp(1, tsBC);
    pstmt.execute();

    pstmt.clearParameters();

    pstmt.setDate(1, dt1);
    pstmt.execute();

    pstmt.clearParameters();
    pstmt.setObject(1, dt1);
    pstmt.execute();

    pstmt.clearParameters();
    pstmt.setObject(1, tsBC);
    pstmt.execute();

    pstmt.close();
    conn.close();

1 个答案:

答案 0 :(得分:1)

您没有向我们展示如何检索和显示ts1字段。我试过你的例子,效果很好。我使用ts1检索getString()字段,并显示

等值
"2014-03-04 05:06:07 BC"

当我使用getTimestamp()检索它时,我检索的值与我插入的值相同,并且与SimpleDateFormat一起显示,它显示为:

2014/03/04 05:06 CET p.n.e.

p.n.e.表示波兰语中的BC(我的语言环境)。

我使用PostgreSQL 9.3和postgresql-9.3-1100.jdbc41.jar