关于Oracle Timezone的一点总结

上传人:m**** 文档编号:69002742 上传时间:2019-01-11 格式:DOCX 页数:7 大小:21.15KB
返回 下载 相关 举报
关于Oracle Timezone的一点总结_第1页
第1页 / 共7页
关于Oracle Timezone的一点总结_第2页
第2页 / 共7页
关于Oracle Timezone的一点总结_第3页
第3页 / 共7页
关于Oracle Timezone的一点总结_第4页
第4页 / 共7页
关于Oracle Timezone的一点总结_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《关于Oracle Timezone的一点总结》由会员分享,可在线阅读,更多相关《关于Oracle Timezone的一点总结(7页珍藏版)》请在金锄头文库上搜索。

1、关于Oracle Timezone的一点总结背景描述:如果需要支持一个国际化的应用,那么数据库端的国际化特性的支持也就显得尤其重要。Oracle中有很多特性支持国际化,如字符集、时区等等。如果相关参数设置不当,或者由于对相关特性不够了解,以至于在设计阶段没有考虑完全,那么肯定会对应用造成一定的损失。偶前不久也遇到了time zone相关的问题,所以在此结合遇到的问题,对时区问题作一个小小的总结。1. 如何查看和修改数据库和session时区Oracle中相关的时区大体可以分为两类:数据库时区和session时区。可以通过以下方式获得:查看数据库时区信息:SQL select dbtimezon

2、e from dual;DBTIME-+08:00查看session时区信息:SQL select sessiontimezone from dual;SESSIONTIMEZONE-+08:00Database的timezone可以在创建数据库的时候指定,如:CREATE DATABASE db01.SET TIME_ZONE=+08:00;或者在数据库创建之后通过alter database语句修改,但是只有重启数据库后有效:ALTER DATABASE SET TIME_ZONE=+08:00;session的timezone可以简单通过alter session语句修改:ALTER S

3、ESSION SET TIME_ZONE=+08:00;Note:Database Time Zone只和TIMESTAMP WITH LOCAL TIME ZONE数据类型相关!其实数据库timezone只是一个计算的标尺,TIMESTAMP WITH LOCAL TIME ZONE数据类型从客户端传入数据库后,转为数据库时区存入数据库。在需要进行相关计算的时候,Oracle先把时间转换为标准时间(UTC),完成计算后再把结果转换为数据库时区的时间保存到数据库。关于TIMESTAMP WITH LOCAL TIME ZONE数据类型的详细信息,请参考随后相关部分:)2. 时区相关的数据类型和

4、时区相关的数据类型主要有:DATE,TIMESTAMP,TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE。粗略介绍如下:DATE:存储日期和时间信息,精确到秒。SQL alter session set nls_date_format=YYYY-MM-DD HH24:MI:SS;Session altered.SQL select to_date(2009-01-12 13:24:33,YYYY-MM-DD HH24:MI:SS) from dual;TO_DATE(2009-01-12-2009-01-12 13:24:33TIM

5、ESTAMP:DATE类型的扩展,保留小数级别的秒,默认为小数点后位。不保存时区和地区信息。SQL select localtimestamp from dual;LOCALTIMESTAMP-12-JAN-09 07.21.37.984000 PMTIMESTAMP WITH TIME ZONE:存储带时区信息的TIMESTAMP(以和UTC时间差或者地区信息的形式保存)。形式大致为:TIMESTAMP 2009-01-12 8:00:00 +8:00TIMESTAMP WITH LOCAL TIME ZONE:另一种不同类型的TIMESTAMP,和TIMESTAMP WITH TIME Z

6、ONE类型的区别在于:数据库不保存时区相关信息,而是把客户端输入的时间转换为基于database timezone的时间后存入数据库(这也就是database tmiezone设置的意义所在,作为TIMESTAMP WITH LOCAL TIME ZONE类型的计算标尺)。当用户请求此类型信息时,Oracle把数据转换为用户session的时区时间返回给用户。所以Oracle建议把database timezone设置为标准时间UTC,这样可以节省每次转换所需要的开销,提高性能。http:/下面是针对以上几种类型所做的实验:操作DATE类型数据:SQL INSERT INTO table_dt

7、 VALUES(1,DATE 2009-01-01);1 row created.SQL INSERT INTO table_dt VALUES(2,TIMESTAMP 2009-01-01 00:00:00 Asia/Hong_Kong);1 row created.SQL INSERT INTO table_dt VALUES(3,TO_DATE(01-JAN-2009,DD-MON-YYYY);1 row created.SQL commit;Commit complete.SQL select * from table_dt; C_ID C_DT- - 1 2009-01-01 00:

8、00:00 2 2009-01-01 00:00:00 3 2009-01-01 00:00:00操作TIMESTAMP数据类型:SQL ALTER SESSION SET NLS_TIMESTAMP_FORMAT=DD-MON-YY HH:MI:SSXFF;Session altered.SQL CREATE TABLE table_ts(c_id NUMBER, c_ts TIMESTAMP);Table created.SQL INSERT INTO table_ts VALUES(1, 01-JAN-2009 2:00:00);1 row created.SQL INSERT INTO

9、 table_ts VALUES(2, TIMESTAMP 2009-01-01 2:00:00);1 row created.SQL INSERT INTO table_ts VALUES(3, TIMESTAMP 2009-01-01 2:00:00 -08:00);1 row created.SQL commit;Commit complete.SQL set linesize 120SQL select * from table_ts; C_ID C_TS- - 1 01-JAN-09 02:00:00.000000 2 01-JAN-09 02:00:00.000000 3 01-J

10、AN-09 02:00:00.000000Note: 第三条数据的时区信息丢失!操作TIMESTAMP WITH TIME ZONE数据类型:SQL ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT=DD-MON-RR HH:MI:SSXFF AM TZR;Session altered.SQL ALTER SESSION SET TIME_ZONE=-7:00;Session altered.SQL CREATE TABLE table_tstz (c_id NUMBER, c_tstz TIMESTAMP WITH TIME ZONE);Table cre

11、ated.SQL INSERT INTO table_tstz VALUES(1, 01-JAN-2009 2:00:00 AM -07:00);1 row created.SQL INSERT INTO table_tstz VALUES(2, TIMESTAMP 2009-01-01 2:00:00);1 row created.SQL INSERT INTO table_tstz VALUES(3, TIMESTAMP 2009-01-01 2:00:00 -8:00);1 row created.SQL commit;Commit complete.SQL select * from

12、table_tstz; C_ID C_TSTZ- - 1 01-JAN-09 02:00:00.000000 AM -07:00 2 01-JAN-09 02:00:00.000000 AM -07:00 3 01-JAN-09 02:00:00.000000 AM -08:00Note: 第三条数据保存了时区信息! 可以和上一个例子TIMESTAMP类型做一个对比。操作TIMESTAMP WITH LOCAL TIME ZONE数据类型:SQL ALTER SESSION SET TIME_ZONE=-07:00;Session altered.SQL CREATE TABLE table_

13、tsltz (c_id NUMBER, c_tsltz TIMESTAMP WITH LOCAL TIME ZONE);Table created.SQL INSERT INTO table_tsltz VALUES(1, 01-JAN-2009 2:00:00);1 row created.SQL INSERT INTO table_tsltz VALUES(2, TIMESTAMP 2009-01-01 2:00:00);1 row created.SQL INSERT INTO table_tsltz VALUES(3, TIMESTAMP 2009-01-01 2:00:00 -08:00);1 row created.SQL commit;Commit complete.SQL select * from table_tsltz; C_ID C_TSLTZ- - 1 01-JAN-09 02:00:00.000000 2 01-JAN-09 02:00:00.000000 3 01-JAN-09 03:00:00.000000Note:插入的第三条数据指定为UTC-8时

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 数据库

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号