所在位置:首页 -- 数据库 -- 正文

Oracle与PostgreSQL中Timestamp型公元前、后数值的详解及JDBC存取


发布时间:2013-10-4  来源:admin

Oracle与PostgreSQL中Timestamp型公元前、后数值的详解及JDBC存取
 
字段:date
value1: 2010-01-01
value2: 2010-01-01BC
1.直接向数据库插入数值时:
   oracle需要使用to_timestamp('2010-01-01','yyyy-mm-ddBC'),
    PG可以直接用字符串‘2010-01-01BC'。
 
2.直接从数据库查询时:
   在oracle数据库中直接查询date字段,value1和value1显示没有区别,均为2010-01-01,
   使用to_char(time,'dd-mm-yyyybc','nls_date_language=American') ,才显示出bc和ad。如下:
 
1
SQL> select time,to_char(time,'dd-mm-yyyybc','nls_date_language=American') AS TRUDATE;
2
  
3
TIME                                                        TRUEDATE
4
---------------------------------------------------------------------------
5
01-JAN-10 12.00.00.000000 AM        01-01-2010bc
6
01-JAN-10 12.00.00.000000 AM        01-01-2010ad
  在PG中:直接查询即可显示BC,如下:
 
 
1
highgo=# select * from testtime;
2
id |          time
3
----+------------------------
4
  1 | 2010-01-01 00:00:00
5
  2 | 2010-01-01 00:00:00 BC
 
3.在java中,分别取value1和value2的字符串值(用于copy)和时间戳值(用于insert,绑定参数)。
          java代码:                     
01
System.out.println("DataType: "+rs.getMetaData().getColumnTypeName(1));         
02
       
03
rs.next();
04
System.out.println("getString:   " + rs.getString(1));
05
Timestamp time1=  rs.getTimestamp(1);
06
System.out.println("getTimestamp:   " + time1);
07
           
08
rs.next();
09
System.out.println("getString:   " + rs.getString(1));
10
Timestamp time2=  rs.getTimestamp(1);
11
System.out.println("getTimestamp:   " + time2);
12
 
13
System.out.println("time1Compare2Time2:  "+ time1.compareTo(time2));
       Oracle的输出结果:
 
       DataType:  TIMESTAMP 
       getString:   2010-01-01 00:00:00.0
       getTimestamp:   2010-01-01 00:00:00.0
       getString:   -2010-01-01 00:00:00.0          
       getTimestamp:   2011-01-01 00:00:00.0    
       time1Compare2Time2:  1                      
      分析:该结果说明了java得到的字符串是带时间符号的,得到的时间戳却不带符号,但是比较的结果却是正确的(2010-01-01 要比 2010-01-01 BC更未来),但是得到的时间戳却是一个不带符号的怪异的值,搜索网络,得到一个来PG文档的符合的解释(虽然相符,但无法保证确切性,还有待进一步查证):If BC has been specified, negate the year and add one for internal storage. (There is no year zero in the Gregorian calendar, so numerically 1 BC becomes year zero.) 意思是:如果声明了 BC 则对年份取其负数并加一,用于内部保存。因为在格里高利历法里没有零年,所以数字上的 1BC 是公元零年。
 
         PG的输出结果:            
 
         DataType: timestamp
         getString:   2010-01-02 00:00:00
         getTimestamp:   2010-01-02 00:00:00.0
         getString:   2010-01-02 00:00:00 BC
         getTimestamp:   2010-01-02 00:00:00.0
         time1Compare2Time2: 1
         分析:这个结果的字符串是标明公元前的,但是得到的时间戳却没有任何的区别,但是对两个时间戳比较的结果仍然是正确的(即2010-01-01 要比 2010-01-01 BC更未来).
 
4.在PG中测试Timestamp的COPY情况:   
      带负号的时间戳(即公元前的时间)是无法使用copy的;
      我们来测试带BC的时间戳,结果是带BC的时间戳是可以使用copy的。
     文本time.csv中存储以下内容,使用copy testtime from 'G:/time.csv' with csv;,结果copy成功,查询数据无误。
 
1
"3","2011-01-02 00:00:00"
2
"4","2011-01-02 00:00:00 BC"
 

中联软博