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

oracle之时间类型的更多相关文章

  1. oracle 数据库时间类型为字符串 时间范围大小查询

    select * from invoicedetail t2 where t2.Memo is null and to_char(to_date(t2.PrintDate,'yyyy-MM-dd hh ...

  2. Oracle数据库时间类型悬疑案

    这次遇到的问题小Alan其实一年半前做证券行业项目就已经遇到过,但是一直没有去思考是什么原因导致的这样的悬疑案,悬疑案是什么呢?其实很简单,我想有不少童鞋都有用到Oracle数据库,情形是这样子的,这 ...

  3. oracle 中时间类型 date 与 long 互转

    我们在保存时间到数据库时,有时候会保存long型的数据,固定长度是13位,是用当前时间减去1970-01-01,再换算成毫秒得到的结果. 但是要考虑到时区问题中国的时区时+8区所以时间要加上8小时 o ...

  4. KingbaseES 时间类型数据和oracle时间类型的区别

    Oracle日期时间类型有两类,一类是日期时间类型,包括Date, Timestamp with time zone, Timestamp with local time zone.另一类是Inter ...

  5. C# Oracle 时间字符串转时间类型

    C# 字符串转时间类型 yyyy-MM-dd HH:mm:ss  yyyy-MM-dd hh:mm:ss d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. d ...

  6. ORACLE插入DATE类型字段

    1 怎样在ORACLE中输入DATE类型的字段 insert into table_name (date_column) values(to_date('2006-06-04','yyyy-mm-dd ...

  7. Oracle日期时间函数大全

    ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...

  8. ORACLE对时间日期的处理(转)

    共三部分: 第一部分:oracle sql日期比较: http://www.cnblogs.com/sopost/archive/2011/12/03/2275078.html 第二部分:Oracle ...

  9. oracle中时间运算

    Oracle两个函数相减,默认得到的是天数,按日期格式,精准到响应的精度,如用sysdate(2015/12/7 10:17:52),时间差精确到秒. 在此基础上,oracle两个时间相减默认天数*2 ...

随机推荐

  1. 编译原理——求解First,Follow,Firstvt和Lastvt集合

    转载地址 http://dongtq2010.blog.163.com/blog/static/1750224812011520113332714/ 学编译原理的时候,印象最深的莫过于这四个集合了,而 ...

  2. jquery—实现能滚动的选项卡效果

    选项卡在网页中很常见,可以说是必备的一个元素了,网上其实也有很多案例讲解选项卡的做法,写这篇文章,就是记录下自己的写一个的实例效果图: html: css样式: 主要是滚动条的的样式设置width:1 ...

  3. 离线人脸识别门禁考勤——Android设备端APK及源码免费下载

    适用场景:门禁场景的应用,适合安装在Android系统的门口机.闸机头.Pad等设备上. 主要功能:人员注册.人脸识别开门.考勤打卡.门禁权限管理.识别记录查询等. 预览效果: PC端 设备端1 设备 ...

  4. IOS 崩溃原因统计 2014-07-12 10:13

    注意: 1,释放自己的autorelease对象,app会crash: 2,释放系统的autorelease对象,app会crash:   第一种 情况有现象如下: 声明一个 对象 A* obj:把o ...

  5. 设置与查看Linux系统中的环境变量

    大家好,我是良许. 大家都知道,在 Linux 系统中,有环境变量和 Shell 变量这两种变量. 环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路 ...

  6. python 03 常用操作符

    1. e记法,科学计数法. AeB   A,B为整数,A*10的B次方. 2. 逻辑运算,真为1,假为0,最好不使用这个计算 true(1)    false(0) true+true=2 3.类型转 ...

  7. python基础-文件读写'r' 和 'rb'区别

    一.Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r':默认值,表示从文件读取数据.'w':表示要向文件写入数据,并 ...

  8. 清空ARP缓存

    arp -n|awk '/^[1-9]/{print "arp -d " $1}'|sh -x

  9. MySQL数据库时间字段按年月日显示并多字段去重查询

    应用服务长久运行,难免要导出一些统计报表. 现在有一个日志表,记录了各种日志,需要导出十月份的登录日志,要求时间按日期显示,且每天用户登陆要去重. 先看日志表的字段构成: logType等于2的是登陆 ...

  10. IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效

    这个错误绝对是我写到现在为止最傻X的一个错误,先上图 问题: 出了一个特别长的错误,大致的意思就是mapper.xml文件注入Dao层的时候失败. 解决: 查看一下错误的位置→ 找到Dao层 找到错误 ...