如何将非系统时区保存到oracle 时区转换

Oracle 9i 开始多了 3 个关于时间的数据类型:TIMESTAMP [(precision)] TIMESTAMP [(precision)] WITH TIME ZONE TIMESTAMP [(precision)] WITH LOCAL TIME ZONE,其中 TIMESTAMP [(precision)] WITH TIME ZONE 保存了时区信息。
1. Oracle 的时区设置
&&& Oracle 的时区可以分为两种,一种是数据库的时区,一种是 session 时区,也就是客户端连接时的时区(经过实验,连接以后再修改客户端的时区,session 的时区不会更改)。
&&& 数据库的时区在创建数据库时可以通过在 create database 语句中加上 SET TIME_ZONE = ' { { + | - } hh : mi | time_zone_region } ' 来指定,如果,不指定,默认是按照数据库所在的操作系统时区来设定的。创建之后,可以通过 alter database 来修改。其中 time_zone_region 参数可以通过查询 V$TIMEZONE_NAMES 动态视图来获得所有支持的值。修改之后,需要重启数据库才能生效。经常有人会碰到无法修改的情况:
SQL& alter database set time_zone='+06:00';
alter database set time_zone='+06:00'
ERROR at line 1:
ORA-02231: missing or invalid option to ALTER DATABASE
&&& TOM 对此问题有过,TIME_ZONE 的设定主要是为了 WITH LOCAL TIME ZONE,当 session 的时区和数据库的时区不同时,oracle 根据时区的差距转换到数据库的时间,再保存到数据库的 WITH LOCAL TIME ZONE 类型中,他是不保存时区的,所以需要 TIME_ZONE 来进行各种时区之间时间的转换(WITH TIME ZONE 类型保存了原始的时区,所以不需要 TIME_ZONE 的设置也可以进行各种时区之间的转换)。但数据库中一旦有了该类型,就不能通过 alter database 修改时区了,会得到上面的错误,可以通过下面的语句获得所有包含该类型的表,将他们删除之后,再修改。
select u.name || '.' || o.name || '.' || c.name TSLTZcolumn
& from sys.obj$ o, sys.col$ c, sys.user$ u
where c.type# = 231
&& and o.obj# = c.obj#
&& and u.user# = o.owner#;
(一般查询后的结果为:OE.ORDERS.ORDER_DATE,指的是OE用户下的ORDERS表的ORDER_DATE字段使用了时区的信息:WITH LOCAL TIME ZONE,将此信息去掉就可以再修改了,修改好了之后需要重启数据库才能生效)
&&& Session 的时区是根据客户端的时区来决定的,当然连接以后也可以通过 alter session 来改变。WITH LOCAL TIME ZONE 类型会根据 TIME_ZONE 的设置,自动把时间转换为 session 所在时区的时间显示出来,而 WITH TIME ZONE 因为保存了时区,不需要根据 TIME_ZONE 的设置来转换。
2. 查看时区
&&& 可以分别使用 SESSIONTIMEZONE / DBTIMEZONE 内建函数查看 session 和数据库时区:
SYS@SKYDB& select
SYS@SKYDB& select sessi
SESSIONTIMEZONE
---------------------------------------------
&&& 另外可以用 TZ_OFFSET 查询某时区和 UTC 之间的差值。
TZ_OFFSET ( { 'time_zone_name'
&&&&&&&&&&&&&&&&&&&&&&& | '{ + | - } hh : mi'
&&&&&&&&&&&&&&&&&&&&& & | SESSIONTIMEZONE
&&&&&&&&&&&&&&&&&&&&& & | DBTMEZONE& }
&&&&&&&&&&&&&&&&&&&&& )
SELECT TZ_OFFSET('US/Eastern') FROM DUAL;
SELECT TZ_OFFSET(DBTIMEZONE) FROM DUAL;
TZ_OFFSET(DBTI
--------------
&&& 其中 time_zone_name 也可以从 V$TIMEZONE_NAMES 获得。
3. 几个内建时间函数的比较
&&& sysdate/systimestamp 都是返回数据库的时间并且使用数据库的时区,他们返回的是操作系统的时间。sysdate 返回的是 date 类型,没有时区信息,操作系统上是什么时间就返回什么时间;systimestamp 返回 TIMESTAMP WITH TIME ZONE 类新,有时区信息:
SYS@SKYDB& sele
-------------------
SYS@SKYDB& select sy
SYSTIMESTAMP
-----------------------------------------------
03-AUG-06 10.02.21.093000 AM +08:00
SYS@SKYDB& shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
修改操作系统时区为 +02:00
SYS@SKYDB& startup
ORACLE instance started.
Total System Global Area&&
Fixed Size&&&&&&&&&&&&&&&&&& 454424 bytes
Variable Size&&&&&&&&&&&&&
Database Buffers&&&&&&&&&&
Redo Buffers&&&&&&&&&&&&&&&& 667648 bytes
Database mounted.
Database opened.
SYS@SKYDB& sele
-------------------
SYS@SKYDB& select sy
SYSTIMESTAMP
----------------------------------------------
03-AUG-06 04.04.15.687000 AM +02:00
&&& 注:这是我单位机子上实验的结果,由于建了多个数据库,不知道为什么不能通过 ipc 来连接本地数据了,登陆时使用 sqlplus "/@skydb as sysdba",也就是使用了监听器来连接,但在家里做相同的实验,通过 ipc 连接 sqlplus "/as sysdba",修改时区后,sysdate 依然显示修改前的时间,而 systimestamp 却正确,不知道是什么原因:
-------------------
SQL& select sy
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 10.22.38.578000 PM +08:00
SQL& shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
修改时区为 +09:00
SQL& startup
ORACLE instance started.
Total System Global Area&
Fixed Size&&&&&&&&&&&&&&&&&& 453992
Variable Size&&&&&&&&&&&&
Database Buffers&&&&&&&&&&
Redo Buffers&&&&&&&&&&&&&&&& 667648
Database mounted.
Database opened.
SQL& alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
-------------------
22:32:59&&&&&&&&&&&&& &- 还是之前的时间
SQL& select sy
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 11.35.05.171000 PM +09:00&&&&&&&&& &- 时间正确
&&& 另外,有个初始化参数 fixed_date,可以设置 sysdate 返回指定的时间:
alter system set fixed_date='-11-00-00'
this fixed_date is normally used, in oracle, for dubugging purpose.
once finishing it, you can set it back:
alter system set fixed_date=none
&&&&Eygle 的关于这个参数的相关文章:&&& current_timestamp/current_date 也会返回数据库的时间,但转换为 session 的时区进行显示,可以使用 alter session set time_zone 改变 session 时区。
4. 四个日期时间类型的实验
SQL& select
SQL& select sessi
SESSIONTIMEZONE
---------------------------------------------------------------------------
Wrote file afiedt.buf
& 1& create table tztest(a date,
& 2& b timestamp(0),
& 3& c timestamp(0) with time zone,
& 4* d timestamp(0) with local time zone)
Table created.
SQL& alter session set nls_date_format ='yyyy-dd-mm hh24:mi:ss';
Session altered.
-------------------
SQL& select sy
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 10.22.38.578000 PM +08:00
SQL& select current_
CURRENT_DATE
-------------------
SQL& select current_
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 10.24.04.031000 PM +08:00
SQL& insert into tztest
& 2& values(sysdate,systimestamp,systimestamp,systimestamp);
1 row created.
Commit complete.
SQL& select *
-------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
02-AUG-06 10.25.59 PM
02-AUG-06 10.25.59 PM +08:00
02-AUG-06 10.25.59 PM
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production
修改了客户端操作系统的时区
C:\Documents and Settings\Administrator&sqlplus sky/xxxx
SQL*Plus: Release 9.2.0.3.0 - Production on Wed Aug 2 23:28:01 2006
Copyright (c) , Oracle Corporation.& All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production
SQL& alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
-------------------
22:28:49&&&&&&& &-数据库没有重启,时间依然是修改前的
SQL& select sy
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 11.29.33.609000 PM +09:00& &- 这里却已经改变了,有时区信息,自动转换了?
SQL& select *
-------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
22:25:59&&&&&&&&&&&&&&&&&&&&&& &- 没变
02-AUG-06 10.25.59 PM&&&&&&&&&&&&&&&&& &- 没变
02-AUG-06 10.25.59 PM +08:00&&&&& &- 保存时区信息
02-AUG-06 11.25.59 PM&&&&&&&&&&&&&&&&& &-自动转换为 session 的时区
阅读(...) 评论()我装oracle时出现了如下错误,网上查说要把时区改一下,改了呀,服务也都是打开的,为什么还是错误_百度知道
我装oracle时出现了如下错误,网上查说要把时区改一下,改了呀,服务也都是打开的,为什么还是错误
装oracle时出现了如下错误,改了呀,网上查说要把时区改一下,服务也都是打开的,为什么还是错误,想哭
我有更好的答案
数据库的时区和电脑所用时区一致,如果是win系统,改完之后建议重启系统,如果是红帽,重新登录
采纳率:70%
来自团队:
重新安装了
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包一、通过修改系统时间,来修改ORACLE的时间格式(win7,ORACLE11g 11.2.0.3.0)
1、直接联网获取服务器时间,这个方法比较简单,而且时间也准确无误。如图,点击右下角时间,弹出设置窗口
2、点击“更改时间和日期设置”
3、在弹出设置窗口中选择“internet
时间”菜单项,点击右下方“更改设置”
4、接着,在跳出的“internet时间设置”窗口,勾选“与internet时间服务器同步”,在“服务器”下拉列表中选择任意服务器地址后,在点击“立即更新”。
5、正在同步时间
6、时间同步成功。
二、注册表如下位置增加一个字符串值NLS_DATE_FORMAT,内容为你希望的日期格式,比如,yyyy-mm-dd hh24:MI:ss
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\你安装的oracle名称
接着,在跳出的“internet时间设置”窗口,勾选“与internet时间服务器同步”,在“服务器”下拉列表中选择任意服务器地址后,在点击“立即更新”。
本文已收录于以下专栏:
相关文章推荐
Oracle 数据库服务器修改操作系统时间的注意事项
1、Oracle的日期格式
Oracle数据缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。例如,使用us7ascii字符集(或者是其他的英语字符集)时,缺省...
Oracle 修改默认日期格式
分类: 数据库
17:31 3824人阅读 评论(0) 收藏 举报
1、Oracle的日期格式
Oracle数据缺省的...
改变ORACLE
-NLS_DATE_FORMAT中时间显示格式的显示有以下四种方式:
1.可以在用户环境变量中指定(LINUX)。
在用户的.bash_profile中增加两句:
oracle 设置日期的默认值1.修改日期字段的默认值为但前系统的时间:
alter table...
1、通过session来修改, alter session set nls_date_format='yyyy-mm-dd' 不过这在下次你登陆oracle是将恢复系统的默认时间格式,不是首选2、通过...
如果时间字段是timestamp类型:UPDATE TABLE
SET COLUMN_START_TIME = to_timestamp(to_CHAR(sysdate,'YYYY-MM-DD')|...
1.日期时间间隔操作 当前时间减去7分钟的时间select
sysdate,sysdate - interval '7' MINUTE
from dual当前时间减去7小时的时间select
oracle 设置日期的默认值
1.修改日期字段的默认值为但前系统的时间:
alter table 表名
modify 日期字段
default sysdate
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)君,已阅读到文档的结尾了呢~~
2016新编教你怎样在Oracle 9i中正确转换时区
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
2016新编教你怎样在Oracle 9i中正确转换时区
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Oracle Linux 操作系统及数据库的时区机制分析 - Oracle Life - 云和恩墨,成就所托!
Oracle Linux 操作系统及数据库的时区机制分析
在Linux操作系统上,Oracle数据库的时区和以下几个因素有关:1. /etc/localtime这个文件记录的是系统的时区,缺省的数据库由此获得时区信息这个文件是二进制文件,修改该文件的方法是拷贝/usr/share/zoneinfo下的相应时区文件覆盖 localtime 文件。/etc/sysconfig/clock 与 localtime 配置,定义的是时区名称区域信息等。2./usr/share/zoneinfo/该目录存储所有合法的时区信息,如果会话设置的时区和系统时区不一致,则由此读取时区信息。3.$ORACLE_HOME/oracore/zoneinfo这里存储的文件记录数据库的合法时区,和操作系统提供的信息会进行对比。-rw-rw-r--. 1 oracle oinstall&& 1407 Jun& 1& 2009 readme.txt-rw-rw-r--. 1 oracle oinstall 408315 Apr 14& 2010 timezlrg.dat-rw-rw-r--. 1 oracle oinstall 160733 Apr 14& 2010 timezone.dat4.Linux上的时区信息可以通过 tzselect 命令查看,使用 timeconfig 进行配置修改5.会话级别的时区设置可以如下进行TZ='Asia/Shanghai';export TZ 6.hwclock -w&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 保存时区设置使之重启系统后仍生效关于Oracle的时区选项与时区关系,可以通过strace跟踪进程,清晰的获得整个流程:分析整个过程中的文件读取:open("/etc/ld.so.preload", O_RDONLY)&&& = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/tls/x86_64/libsqlplus.so", O_RDONLY) = -1 ENOENT (No such file or directory)open("/u01/app/oracle/product/10.2.0/db_1/lib/tls/libsqlplus.so", O_RDONLY) = -1 ENOENT (No such file or directory)open("/u01/app/oracle/product/10.2.0/db_1/lib/x86_64/libsqlplus.so", O_RDONLY) = -1 ENOENT (No such file or directory)open("/u01/app/oracle/product/10.2.0/db_1/lib/libsqlplus.so", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libclntsh.so.10.1", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libnnz10.so", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY)&&&&& = 3open("/lib64/libdl.so.2", O_RDONLY)&&&& = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)open("/lib64/libm.so.6", O_RDONLY)&&&&& = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libpthread.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)open("/lib64/libpthread.so.0", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libnsl.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)open("/lib64/libnsl.so.1", O_RDONLY)&&& = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)open("/lib64/libc.so.6", O_RDONLY)&&&&& = 3open("/u01/app/oracle/product/10.2.0/db_1/lib/libsqlplusic.so", O_RDONLY) = -1 ENOENT (No such file or directory)open("/u01/app/oracle/product/10.2.0/db_1/lib/libociicus.so", O_RDONLY) = -1 ENOENT (No such file or directory)open("/u01/app/oracle/product/10.2.0/db_1/lib/libociei.so", O_RDONLY) = -1 ENOENT (No such file or directory)open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx1boot.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx00001.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx20354.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx10001.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx40011.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx20001.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/nls/data/lx40001.nlb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/sqlplus/mesg/sp1us.msb", O_RDONLY) = 3open("/u01/app/oracle/product/10.2.0/db_1/sqlplus/mesg/sp2us.msb", O_RDONLY) = 4open("/u01/app/oracle/product/10.2.0/db_1/sqlplus/mesg/cpyus.msb", O_RDONLY) = 5open("/usr/share/zoneinfo/Asia/Shanghai", O_RDONLY) = 6open("/u01/app/oracle/product/10.2.0/db_1/oracore/zoneinfo/timezlrg.dat", O_RDONLY) = 6open("/u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/ocius.msb", O_RDONLY) = 6可以看到Oracle读取的操作系统时区文件:/usr/share/zoneinfo/Asia/Shanghai这是跟进环境变量的设置读取的,数据库的时区文件则是:/u01/app/oracle/product/10.2.0/db_1/oracore/zoneinfo/timezlrg.dat这整个验证过程和Oracle的字符集完全相同,很有意思。
历史上的今天...
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
By eygle on
CopyRight &copy
, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-0 or 7037 业务合作:

我要回帖

更多关于 oracle 时区设置 的文章

 

随机推荐