时区相关概念
UTC时间,标准时区,其他地区的时区根据时间与UTC的差距,做偏移量,如New York晚于UTC 5小时,则为-5:00。
Oracle建议将数据库时区设置为UTC。
数据库时区,安装数据库的位置所在的时区,可通过函数DBTIMEZONE获取。
会话时区,用户所在的时区,可通过函数SESSIONTIMEZONE。
时区相关数据类型
DATE
TIMESTAMP
同DATE类型,但是增加了含有小数点的秒,提高精度
TIMESTAMP WITH TIME ZONE
类似TIMESTAMP,但附加了TIMEZONE_HOUR, TIMEZONE_MINUTE, TIMEZONE_REGION, TIMEZONE_ABBR信息。
TIMESTAMP WITH LOCAL TIME ZONE
与TIMESTAMP,不包含时区相关的数据,当查询TIMESTAMP WITH LOCAL TIME ZONE类型数据时,数据将以用户本地的时区,展示给用户。
几个比较重要的时区函数
1)DBTIMEZONE
语法:DBTIMEZONE
参数:无参数
返回:返回字符类型数据
作用:返回数据库所在位置的时区
实例:
返回当前数据的时区,根据结果可知,当前数据库的时区被设置为UTC
SQL> select dbtimezone from dual; (Dual表是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select中。
DBTIMEZONE从DUAL表选择数据常被用来通过SELECT语句计算常数表达式)
----------
+00:00
2) SESSIONTIMEZONE
语法:SESSIONTIMEZONE
参数:无参数
返回:返回字符类型数据
作用:返回当前会话的时区
实例:
SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
------------------------------------------
+08:00
3) CURRENT_DATE、CURRENT_TIMESTAMP
语法:CURRENT_DATE, CURRENT_TIMESTAMP(t)
参数:CURRENT_DATE无参数;
CURRENT_TIMESTAMP中的参数t,指定本地时区小数点后的精度,范围1-9。可选项,默认为6
返回:CURRENT_DATE返回日期类型的数据;
CURRENT_TIMESTAMP返回TIMESTAMP WITH TIME ZONE类型数据
作用:CURRENT_DATE返回当前日期
CURRENT_TIMESTAMP返回会话的时间戳,包含时区信息
实例:
SQL> select current_date,current_timestamp from dual;
CURRENT_DATE CURRENT_TIMESTAMP
------------ --------------------------------------
2011-4-19 14 19-APR-11 02.23.58.545048 PM +08:00
注:current_date返回的结果其实也包含时分秒(不包含精度),可通过to_char转换函数来获取
如:
SQL> select to_char(current_date,'yyyy-mm-dd hh24:mi:ss'),current_timestamp from dual;
TO_CHAR(CURRENT_DATE,'YYYY-MM- CURRENT_TIMESTAMP
------------------------------ ---------------------------------------
2011-04-19 14:28:22 19-APR-11 02.28.22.258097 PM +08:00
4) LOCALTIMESTAMP
语法:LOCALTIMESTAMP(t)
参数:参数't'指定本地时区小数点后的精度,范围1-9。可选项,默认为6
返回:返回TIMESTAMP类型的数据,即不包含时区信息
作用:显示用户会话的本地时间,包含年月日时分秒,及秒的精度值。
实例:
SQL> SELECT LOCALTIMESTAMP(4) FROM DUAL;
LOCALTIMESTAMP(4)
----------------------------
19-APR-11 02.32.54.3425 PM
5) SYSTIMESTAMP
语法:SYSTIMESTAMP
参数:无参数
返回:返回TIMESTAMP WITH TIME ZONE类型的操作系统时间,含精度
作用:返回TIMESTAMP WITH TIME ZONE类型的系统日期,包含秒的精度
实例:
SQL> select systimestamp from dual;
SYSTIMESTAMP
-----------------------------------------
19-APR-11 02.34.15.286712 PM +08:00
实际应用中,习惯将时间以毫秒(ms)形式存储为NUMBER 或者VARCHAR 类型。 使用getTime()函数是以格林威治时间1970-1-1 0:0:0作为参考,故取cn时间就应该考虑到时区问题。常用的将数据库时间转化成字符串的方法
有 TO_CHAR(TO_DATE('1970/01/01','yyyy/mm/dd')+ MYDATE/(1000*60*60*24)+TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24,'YYYY-MM-DD')
//MYDATE是目标时间