当前位置: 首页 > 图文教程 > 数据库 > Oracle > 怎样在Oracle 9i中正确的转换时区

Oracle
Oracle数据库技术(32)
Oracle数据库技术(33)
Oracle数据库技术(34)
Oracle数据库技术(35)
Oracle数据库技术(36)
Oracle数据安全面面观
Oracle数据操作和控制语言详解
Oracle数据库数据对象分析
解析Oracle 8i/9i的计划稳定性
使用Oracle实现实时通信
Oracle数据库中索引的维护
Oracle数据库游标使用大全
Oracle9i中监视索引的使用
在Oracle9i中使用多种Block Size
监控Oracle数据库的常用shell脚本
Performance Improvement Tips for Oracle on UNIX
Raw Partitions and Windows NT
How to use OS commands to diagnose Database Performance issues?
Raw Devices and Oracle - 20 Common Questions and Answers
Monitor Oracle Resource Consumption in UNIX

怎样在Oracle 9i中正确的转换时区


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 54 ::
收藏到网摘: n/a

很多人都知道,在Oracle 9i之前,虽然有一个NEW_TIME函数可以改变DATE的时间戳部分,但是还没有专门用来存储时区信息的数据类型。在Oracle9i中,我们可以使用DBTIMEZONE伪字段查询数据库的时区,使用SESSIONTIMEZONE伪字段查询会话的时区。

但是,对于大多数数据库,这些值都是-07:00之类的偏移值,因此对于NEW_TIME函数是没有用的。Oracle9i有关NEW_TIME的文档建议使用FROM_TZ来替代,但是这可能会产生误导。FROM_TZ只将一个时区应用到一个时间戳上;它并不能把一个时区转换成另外一个时区。

 

其实有一个比较好的方法(从文档中得到这个方法可能有点难)。首先,为了完成这个工作,在正确的时区内需要一个TIMESTAMP WITH ZONE数据类型。然后,如果你将关键字AT TIME ZONE应用到那个值,它就会自动地调整为新的时区和日期。

  select (timestamp '2003-04-06 01:59:59' at time zone 'PDT') at time zone 'GMT'
  from dual;
  
  06-APR-03 08.59.59.00000000 AM GMT

这个语句将为太平洋白天时间(即其切换到PST之前的时刻)构造一个TIMESTAMP WITH TIME ZONE然后再将其转换到GMT。AT TIME ZONE关键字也接受默认的偏移值语法:

select (timestamp '2003-04-06 02:00:00'
at time zone '-07:00') at time zone
'00:00' from dual;
06-APR-03 09.00.00.000000000 AM +00:00

你还可以使用伪字段来自动调整当前会话的时区:

selectcurrent_timestamp at time zone dbtimezone from dual;

上面的表达式返回一个当前会话的本地时间(数据类型为时区),重新调整数据库的时区,调整后的时区将与SYSTIMESTAMP的结果相等。

有了以上的这些信息,就可以构造一个比较好的NEW_TIME函数:

create or replace function my_new_time
  (
    p_dwtz timestamp with time zone,
    p_tz varchar2
  ) return date
  is
  begin
    return cast(p_dwtz at time zone p_tz as date);
  end my_new_time;
  /
  show errors;
  
  select my_new_time(sysdate,'+08:00') from dual;

如果第一个参数被标记为一个timestamp with time zone,你可以传入一个TIMESTAMP和DATE,这样由于Oracle的自动转型操作,得到的时间将是会话在本地时区的当前时间。这个函数接受包括偏移值在内的任何可以被TIMESTAMP识别的时区,然后将接受的时区调整为正确的值。