数据库

 首页 > 数据库 > postgresql > Oracle与PostgreSQL中Timestamp型公元前、后数值详解及JDBC存取

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

分享到:
【字体:
导读:
         摘要:字段:datevalue1:2010-01-01value2:2010-01-01BC1.直接向数据库插入数值时:oracle需要使用to_timestamp(2010-01-01,yyyy-mm-ddBC),PG可以直接用字符串‘2010-01-01BC。2.直接从数据库查询时:在oracle数据库中直接查询date...

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"

Oracle与PostgreSQL中Timestamp型公元前、后数值详解及JDBC存取
分享到:
PostgreSQL中的函数索引
PostgreSQL中的函数索引 今天一位同事又问到了这个问题, 函数索引. 这是一个老问题了. PostgreSQL中函数有三种状态, 不稳定, 稳定, 非常稳定. 三种状态分别代表的意思如下 :  如果一个时间字段上要创建to_char(timestamp without time zone, text)的函数索引. 是没有办法创建的, 报错 digoal=> create table ...
iBATIS入门介绍
iBATIS入门介绍    iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。 第一,搭建iBatis 开发环境:官网为:http://www.mybatis.org/  1 、导入相关的jar 包,ibatis-2.3.0.677.jar 、mysql-connec...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……