文档章节

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

YuanyuanL
 YuanyuanL
发布于 2013/09/18 14:58
字数 699
阅读 429
收藏 3
字段: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。如下:

SQL> select time,to_char(time,'dd-mm-yyyybc','nls_date_language=American') AS TRUDATE;
 
TIME                                                        TRUEDATE
---------------------------------------------------------------------------
01-JAN-10 12.00.00.000000 AM        01-01-2010bc
01-JAN-10 12.00.00.000000 AM        01-01-2010ad

  在PG中:直接查询即可显示BC,如下:

highgo=# select * from testtime;
id |          time
----+------------------------
  1 | 2010-01-01 00:00:00
  2 | 2010-01-01 00:00:00 BC

3.在java中,分别取value1和value2的字符串值(用于copy)和时间戳值(用于insert,绑定参数)。
          java代码:                     
System.out.println("DataType: "+rs.getMetaData().getColumnTypeName(1));          
           
     rs.next();
     System.out.println("getString:   " + rs.getString(1));
     Timestamp time1=  rs.getTimestamp(1);
     System.out.println("getTimestamp:   " + time1);
               
     rs.next();
     System.out.println("getString:   " + rs.getString(1));
     Timestamp time2=  rs.getTimestamp(1);
     System.out.println("getTimestamp:   " + time2);
 
     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 是公元零年。
(网址:http://www.postgresql.org/docs/9.2/interactive/datetime-input-rules.html)

         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成功,查询数据无误。

"3","2011-01-02 00:00:00"
"4","2011-01-02 00:00:00 BC"

© 著作权归作者所有

YuanyuanL

YuanyuanL

粉丝 153
博文 325
码字总数 190992
作品 0
济南
部门经理
私信 提问
加载中

评论(3)

八木
八木

引用来自“媛媛小译”的评论

引用来自“八木”的评论

么么哒

我晕 还能不能行了

我行
YuanyuanL
YuanyuanL 博主

引用来自“八木”的评论

么么哒

我晕 还能不能行了
八木
八木
么么哒
JAVA存取PostgreSQL二进制类型bytea

经过测试:JAVA存取PostgreSQL的bytea类型均存在内存的限制问题(存取的数据过大会出现out of memory内存溢出的问题),EnterpriseDB对此做了优化。 取PostgreSQL中的bytea,并存储到硬盘上....

YuanyuanL
2013/08/09
0
0
ETL for Oracle to PostgreSQL 1 - Oracle Data Integrator (ODI)

标签 PostgreSQL , Oracle , ETL , Oracle Data Integrator , ODI 背景 原文 https://www.cdata.com/kb/tech/postgresql-jdbc-odi.rst 正文 ETL PostgreSQL in Oracle Data Integrator This ......

德哥
2018/05/06
0
0
Comparison of different SQL implementations(整理)

Comparison of different SQL implementations The goal of this page — which is a work in progress — is to gather information relevant for people who are porting SQL from one pr......

晨曦之光
2012/04/12
312
0
修改了数据库连接 可是db类型依然是

# 使用的数据库类型,根据db.type的值,下面对应类型的数据库连接要配置正确 db.type = mysql #db.type = postgresql #db.type = oracle #db.type = sqlserver #db.type = db2 # 使用postgre...

施立
2016/09/20
800
3
PostgreSQL 登陆登出(login logout)事件触发方法

标签 PostgreSQL , 事件触发器 , event trigger , hook , login hook , libpq 背景 PostgreSQL 支持event trigger,但是event局限于DDL。当发生DDL时,可以触发一些动作调用用户自定义的eve...

德哥
2018/09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android Camera模块解析之拍照

最近学习Android的camera模块,本文先介绍一下camera2的api,然后给出android camera拍照的例子,讲解一下camera 拍照的原因知识,与大家共勉。 camera2 介绍 android camera拍照功能介绍 一...

天王盖地虎626
11分钟前
4
0
Excel 曝Power Query安全漏洞

近日,Mimecast 威胁中心的安全研究人员,发现了微软 Excel 电子表格应用程序的一个新漏洞,获致 1.2 亿用户易受网络攻击。其指出,该安全漏洞意味着攻击者可以利用 Excel 的 Power Query 查...

linuxCool
17分钟前
1
0
SpringBoot | 第三十八章:基于RabbitMQ实现消息延迟队列方案

前言 >前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制。此机制,在原先对接银联支付时,银联的异步通知也...

oKong
17分钟前
3
0
Excel 曝Power Query安全漏洞

近日,Mimecast 威胁中心的安全研究人员,发现了微软 Excel 电子表格应用程序的一个新漏洞,获致 1.2 亿用户易受网络攻击。其指出,该安全漏洞意味着攻击者可以利用 Excel 的 Power Query 查...

linux-tao
34分钟前
1
0
Java - NIO框架

Java NIO提供了与标准IO不同的IO工作方式。 Channels and Buffers(通道和缓冲区) 标准IO基于字节流和字符流,NIO基于通道(Channel)和缓冲区(Buffer)。数据从channel读取到buffer,或从Buffe...

丰田破产标志
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部