zoukankan      html  css  js  c++  java
  • oracle之时间类型

    Oracle 时间类型及Timezone

    20.1 Oracle的六种时间类型

    DATE
    TIMESTAMP
    TIMESTAMP WITH TIME ZONE
    TIMESTAMP WITH LOCAL TIME ZONE
    INTERVAL YEAR TO MONTH
    INTERVAL DAY TO SECOND

    20.2 DATE和TIMESTAMP类型

    1)DATE只能精确到秒

    SQL> select sysdate from dual;

    SYSDATE
    -------------------
    2013-03-10 07:07:00

    2)TIMESTAMP类型是DATE型的扩展

    SQL> select localtimestamp from dual;

    LOCALTIMESTAMP
    ---------------------------------------------------------------------------
    2013-06-17 10:53:32.201058


    3)DATE类型与TIMESTAMP类型,可以通过CAST函数互转。

    SQL>select sysdate,CAST(sysdate AS TIMESTAMP) "date" from dual;

    SYSDATE             date
    ------------------- ---------------------------------------------------------------------------
    2013-03-10 07:16:28 2013-03-10 07:16:28.000000

    SQL> select localtimestamp,CAST(localtimestamp AS date) "timestamp" from dual;

    LOCALTIMESTAMP                                                              timestamp
    --------------------------------------------------------------------------- -------------------
    2014-07-13 01:52:57.610919                                                  2014-07-13 01:52:58


    4)TIMESTAMP类型可以表示秒小数后9位

    SQL> select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss:ff9 TZR') as "systimestamp" from dual;

    systimestamp
    --------------------------------------------------------------
    2013-03-10 07:14:31:062292000 +08:00


    20.3 Timezone引入的背景

    Oracle有很多特性支持国际化,如字符集、时区等等。和时区相关的两个全球化时间类型是:

    TIMESTAMP WITH TIME ZONE
    TIMESTAMP WITH LOCAL TIME ZONE

    首先要分清两个概念:数据库服务器(Database)上的TIME ZONE

    和客服端(Session)上的TIME ZONE

    1)定位你的数据库服务器位于世界哪个时区

    Database的timezone可以在创建数据库的时候指定,如:



    CREATE DATABASE db01
    ...
    SET TIME_ZONE='+08:00';查看数据库时区信息:结果表示你的服务器在中国北京(东8区)
    SQL> select dbtimezone from dual;

    DBTIME
    ------
    +08:00

    2)定位你的客户端位于世界哪个时区

    session的timezone可以简单通过alter session语句修改:

    ALTER SESSION SET TIME_ZONE='+09:00';

    查看session时区信息:
    结果表示你的服务器在日本东京
    SQL> select sessiontimezone from dual;

    SESSIONTIMEZONE
    ---------------------------------------------------------------------------
    +09:00


    20.4 范例: 模拟北京、东京、伦敦三地的时区,进一步理解Timezone。
     
    全球的一个统一的时间应由 时区+时刻来指定,
    比如2005-4-6 14:00:00.000并不能说清楚到底这是北京的下午2点还是东京的下午两点。两地差一个小时。
     
    2005-4-6 14:00:00.000 +8:00 才是北京时间
    2005-4-6 14:00:00.000 +9:00 则是东京时间
     
    假设总部伦敦有online meeting system, 已经由分部登记了两个网络视频会议,一个在北京,另一个在东京。

    DB服务器在英国(用vbox主控台模拟)

    dbtimezone ='+0:00'  



    管理客户端c-en在英国  (SecureCRT模拟)

    time_zone ='+0:00'  



    一个客户端c-cn在中国 (PL/SQL模拟)              

    time_zone ='+8:00'

     

    一个客户端c-jp在日本 (CMD窗口模拟)

    time_zone ='+8:00'

    为了显示时区格式一致,分别在三个session下执行下面语句

    alter session set nls_timestamp_format='yyyy-mm-dd hh24;mi';
    alter session set NLS_TIMESTAMP_TZ_FORMAT='yyyy-mm-dd HH24:MI:SS TZR';

    假设伦敦服务器里有一个会议表:(这个表只有三个日期类型的字段,代表三种不同的日期类型)

    scott:
    create table meeting_table (ctime1 timestamp,ctime2 timestamp with time zone, ctime3 timestamp with local time zone);
     
    北京用户登记了第一个会议,要在当地早上8点开会
    东京用户登记了第二个会议,也要当地早上8点开会

    两地分别插入以下记录

    insert into meeting_table values (
    to_timestamp('2005-06-29 8:00:00', 'yyyy-mm-dd hh24:mi:ss'),
    to_timestamp('2005-06-29 8:00:00', 'yyyy-mm-dd hh24:mi:ss'),
    to_timestamp('2005-06-29 8:00:00', 'yyyy-mm-dd hh24:mi:ss')
    );
    commit;

    为了显示日期格式统一,在三地分别执行以下设置

    col ctime1 for a20;
    col ctime2 for a30;
    col ctime3 for a25;

    查看三地显示结果:

    北京:
    SQL> select * from meeting_table;
     
    CTIME1                   CTIME2                             CTIME3
    ----------- -------------------- ------------------------------ -------------------------
    2005-06-29 08;00     2005-06-29 08:00:00 +08:00     2005-06-29 08;00
    2005-06-29 08;00     2005-06-29 08:00:00 +09:00     2005-06-29 07;00
     
    东京:
    SQL> select * from meeting_table;

    CTIME1                   CTIME2                             CTIME3
    -------------------- ------------------------------ -------------------------
    2005-06-29 08;00     2005-06-29 08:00:00 +08:00     2005-06-29 09;00
    2005-06-29 08;00     2005-06-29 08:00:00 +09:00     2005-06-29 08;00


    伦敦:
    SQL> select * from meeting_table;

    CTIME1                   CTIME2                             CTIME3
    -------------------- ------------------------------ -------------------------
    2005-06-29 08;00     2005-06-29 08:00:00 +08:00     2005-06-29 00;00
    2005-06-29 08;00     2005-06-29 08:00:00 +09:00     2005-06-28 23;00

    这个例子总结几点:
    1)timestamp无法区分哪个是北京的会,哪个是东京的会(都是8点)
    2)timestamp with time zone给出了时区,可以识别在哪里开会,但伦敦的管理员要在伦敦本地出席其中的网络会议,需要人工换算时间。
    3)timestamp with local time zone,时间自动转换成了本地时间,显示的比较友好。


    20.5(INTERVAL YEAR TO MONTH)和(INTERVAL DAY TO SECOND)时间间隔数据类型    

    Oracle 9i开始,按照SQL99标准,增加了2个时间间隔型数据



    1)INTERVAL YEAR TO MONTH
    用YEAR TO MONTH表示时间间隔大小时要在年和月之间用一个连字符(-) 连接。



    2)INTERVAL DAY TO SECOND


    而DAY TO SECOND表示时间间隔大小时要在日和时间之间用一个空格连接。

    举例:
    表示2年6个月的时间间隔:
    INTERVAL "2-6" YEAR TO MONTH

    表示3天12个小时30分钟6.7秒的时间间隔:
    INTERVAL "3 12:30:06.7" DAY TO SECOND(1)

    时间间隔可以为正,也可以为负。它们可以从各种TIMESTAMP数据类型中加上或者减去,从而得到一个新的TIMESTAMP值。

    因为有精度问题,相对来讲,INTERVAL DAY TO SECOND比INTERVAL YEAR TO MONTH要复杂一些
    看看下面时间间隔关于INTERVAL DAY TO SECOND的字面含义说明
     
    INTERVAL ‘3’ DAY                    //时间间隔为3天
    INTERVAL ‘2’ HOUR                   //时间间隔为2小时
    INTERVAL ‘25’ MINUTE                  //时间间隔为25分钟
    INTERVAL ‘45’ SECOND                 //时间间隔为45秒
    INTERVAL ‘3 2’ DAY TO HOUR            //时间间隔为3天零2小时
    INTERVAL ‘3 2:25’ DAY TO MINUTE            //时间间隔为3天零2小时25分
    INTERVAL ‘3 2:25:45’ DAY TO SECOND        //时间间隔为3天零2小时25分45秒
    INTERVAL ‘123 2:25:45.12’ DAY(3) TO SECOND(2)    //时间间隔为123天零2小时25分45.12秒; 天的精度是3位,秒的部分的精度是2位.    
    INTERVAL ‘-3 2:25:45’ DAY TO SECOND        //时间间隔为负数,值为3天零2小时25分45秒
    INTERVAL ‘1234 2:25:45’ DAY(3) TO SECOND         //时间间隔无效,因为天的位数超过了指定的精度3
    INTERVAL ‘123 2:25:45.123’ DAY TO SECOND(2)    //时间间隔无效,因为秒的小数部分的位数超过了指定的精度2

    20.6 关于numtoyminterval和numtodsinterval函数

    numtoyminterval 用于产生一个指定的时间间隔,可以作为interval year to month 型的数据插入到表中。

    使numtoyminterval产生了一个月的时间间隔和一个年的时间间隔
    SQL> select sysdate,sysdate+numtoyminterval(1,'month'),sysdate+numtoyminterval(1,'year') from dual;

    SYSDATE             SYSDATE+NUMTOYMINTE SYSDATE+NUMTOYMINTE
    ------------------- ------------------- -------------------
    2012-07-09 08:18:59 2012-08-09 08:18:59 2013-07-09 08:18:59

    使numtodsinterval产生了一天的时间间隔和一秒的时间间隔
    SQL> select sysdate,sysdate+numtodsinterval(1,'day'),sysdate+numtodsinterval(1,'second') from dual;

    SYSDATE             SYSDATE+NUMTODSINTE SYSDATE+NUMTODSINTE
    ------------------- ------------------- -------------------
    2012-07-09 09:09:06 2012-07-10 09:09:06 2012-07-09 09:09:07

    20.7 关于to_yminterval和to_dsinterval转换函数

    TO_YMINTERVAL把CHAR、VARCHAR2、NCHAR、NVARCHAR2字符串转换INTERVAL YEAR TO MONTH 类型。

    Years属于integer,取值0-999999999

    Months也属于integer,取值0-11

    SQL> select to_yminterval('15-12') event_time from dual;
    select to_yminterval('15-12') event_time from dual
                         *
    第 1 行出现错误:
    ORA-01843: 无效的月份

    SQL> select to_yminterval('15-11') event_time from dual;

    EVENT_TIME
    ---------------------------------------------------------------------------
    +000000015-11
          

  • 相关阅读:
    Flink 的datastreamAPI 以及function函数的调用,性能调优
    Spark Shuffle原理、Shuffle操作问题解决和参数调优
    Spark学习之JavaRdd
    Redis学习笔记--Redis数据过期策略详解==转
    Elasticsearch 数据搜索篇·【入门级干货】===转
    HBase二级索引的设计(案例讲解)
    C中指针符*和取址符&
    java 中,如何获取文件的MD5值呢?如何比较两个文件是否完全相同呢?
    Mysql数据库的加密与解密
    Lucene 分词
  • 原文地址:https://www.cnblogs.com/jinxf/p/9166679.html
Copyright © 2011-2022 走看看