ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 047-113

047-113

原创 Linux操作系统 作者:jbymy2000 时间:2012-03-19 09:16:59 0 删除 编辑
113. Evaluate the SQL statements:
CREATE TABLE new_order
(orderno NUMBER(4),
booking_date TIMESTAMP WITH LOCAL TIME ZONE);
The database is located in San Francisco where the time zone is -8:00.
The user is located in New York where the time zone is -5:00.
A New York user inserts the following record:
INSERT INTO new_order VALUES(1, TIMESTAMP ‘2007-05-10 6:00:00 -5:00’);
Which statement is true?
A. When the New York user selects the row, booking_date is displayed as
'007-05-10 3.00.00.000000'
B. When the New York user selects the row, booking_date is displayed as
'2007-05-10 6.00.00.000000 -5:00'.
C. When the San Francisco user selects the row, booking_date is displayed
as '2007-05-10 3.00.00.000000'
D. When the San Francisco user selects the row, booking_date is displayed
as '2007-05-10 3.00.00.000000 -8:00'
Answer: C
查看数据库时区信息:
SQL> select dbtimezone from dual;
查看session时区信息:
SQL> select sessiontimezone from dual;
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:33
TIMESTAMP:DATE类型的扩展,保留小数级别的秒,默认为小数点后6位。不保存时区和地区信息。
SQL> select localtimestamp from dual;
LOCALTIMESTAMP
---------------------------------------------------------------------------
12-JAN-09 07.21.37.984000 PM
TIMESTAMP WITH TIME ZONE:存储带时区信息的TIMESTAMP(以和UTC时间差或者地区信息的形式保存)。形式大
致为:
TIMESTAMP '2009-01-12 8:00:00 +8:00'
TIMESTAMP WITH LOCAL TIME ZONE:另一种不同类型的TIMESTAMP,和TIMESTAMP WITH TIME ZONE类型的区别在
于:数据库不保存时区相关信息,而是把客户端输入的时间转换为基于database timezone的时间后存入数据库
(这也就是database tmiezone设置的意义所在,作为TIMESTAMP WITH LOCAL TIME ZONE类型的计算标尺)。当用
户请求此类型信息时,Oracle把数据转换为用户session的时区时间返回给用户。所以Oracle建议把database
timezone设置为标准时间UTC,这样可以节省每次转换所需要的开销,提高性能。
操作TIMESTAMP WITH LOCAL TIME ZONE数据类型:
SQL> ALTER SESSION SET TIME_ZONE='-07:00';
SQL> CREATE TABLE table_tsltz (c_id NUMBER, c_tsltz TIMESTAMP WITH LOCAL TIME ZONE);
SQL> INSERT INTO table_tsltz VALUES(1, '01-JAN-2009 2:00:00');
SQL> INSERT INTO table_tsltz VALUES(2, TIMESTAMP '2009-01-01 2:00:00');
SQL> INSERT INTO table_tsltz VALUES(3, TIMESTAMP '2009-01-01 2:00:00 -08:00');
SQL> commit;
SQL> select * from table_tsltz;
---------------------------------------------------------------------------
1 01-JAN-09 02:00:00.000000
2 01-JAN-09 02:00:00.000000
3 01-JAN-09 03:00:00.000000
Note:插入的第三条数据指定为UTC-8时区的时间,然后存入数据库后按照database timezone的时间保存,最后
在客户端请求的时候,转换为客户端时区的时间(UTC-7)返回!可以参考以下简单实验:
SQL> ALTER SESSION SET TIME_ZONE='-05:00';
SQL> select * from table_tsltz;
---------------------------------------------------------------------------
1 01-JAN-09 04:00:00.000000
2 01-JAN-09 04:00:00.000000
3 01-JAN-09 05:00:00.000000
可以看出,当客户端时区改为UTC-5的时候,TIMESTAMP WITH LOCAL TIME ZONE数据类型的返回信息是会相
应改变的。
在了解了相关数据类型后,那么我们该如何在它们之间做出选择呢?
当你不需要保存时区/地区信息的时候,选择使用TIMESTAMP数据类型,因为它一般需要7-11bytes的存储空
间,可以节省空间。
当你需要保存时区/地区信息的时候,请选择使用TIMESTAMP WITH TIME ZONE数据类型。比如一个跨国银行
业务应用系统,需要精确纪录每一笔交易的时间和地点(时区),在这种情况下就需要纪录时区相关信息。因为
需要纪录时区相关信息,所以需要多一些的存储空间,一般需要13bytes。
当你并不关心操作发生的具体地点,而只是关心操作是在你当前时区的几点发生的时候,选择使用
TIMESTAMP WITH LOCAL TIME ZONE。比如一个全球统一的change control system。用户可能只关心某某操作是
在我的时间几点发生的(比如中国用户看到的是北京时间8:00am,而伦敦的用户看到的是0:00am)。记住,此类
行不保存时区/地区信息,因此如果需要保存相关信息的要慎重

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11312660/viewspace-718921/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 047-112
下一篇: 047-114
请登录后发表评论 登录
全部评论

注册时间:2012-01-10

  • 博文量
    416
  • 访问量
    203413