管理不同时区的数据

一、设置时区

  • 数据库时区
    • 修改
      ALTER DATABASE SET TIME_ZONE = '-05:00';
      ALTER DATABASE SET TIME_ZONE = dbtimezone;
      ALTER DATABASE SET TIME_ZONE = local;
      ALTER DATABASE SET TIME_ZONE = 'America/New_York';
    • 验证
      SELECT DBTIMEZONE FROM DUAL;
  • 会话时区
    • 修改
      ALTER SESSION SET TIME_ZONE = '-05:00';
      ALTER SESSION SET TIME_ZONE = dbtimezone;
      ALTER SESSION SET TIME_ZONE = local;
      ALTER SESSION SET TIME_ZONE = 'America/New_York';
    • 验证
      SELECT SESSIONTIMEZONE FROM DUAL;

二、时间数据类型

函数说明
CURRENT_DATE语法:CURRENT_DATE()
说明:查询当前时间
current_date返回的是当前会话时间,而sysdate返回的是服务器时间。
current_date有时比sysdate快一秒,这可能是四舍五入的结果。
如果修改当前会话的时区,比如将中国的时区为东八区,修改为东九区,则current_date显示的时间为东九区时间,根据东加西减的原则,current_date应该比sysdate快一小时。

例句:

select current_date, sysdate from dual;

CURRENT_TIMESTAMP语法:CURRENT_TIMESTAMP()
说明:以timestamp with time zone数据类型返回当前会话时区中的当前日期

例句:

SELECT CURRENT_TIMESTAMP  
  FROM DUAL;

LOCALTIMESTAMP语法:LOCALTIMESTAMP()
说明:以本地timestamp数据类型返回当前会话时区中的当前日期

例句:

SELECT LOCALTIMESTAMP
  FROM DUAL;

EXTRACT语法:
EXTRACT (
  { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
  | { TIMEZONE_HOUR | TIMEZONE_MINUTE }
  | { TIMEZONE_REGION | TIMEZONE_ABBR }
  FROM { date_value | interval_value } )
说明:
我们只可以从一个date类型中截取 year,month,day(date日期的格式为yyyy-mm-dd);
我们只可以从一个 timestamp with time zone 的数据类型中截取TIMEZONE_HOUR和TIMEZONE_MINUTE;
例句:

例一:

SELECT EXTRACT(year FROM DATE '2011-05-17') "year", 
       EXTRACT(month FROM DATE '2011-05-17') "month", 
       EXTRACT(day FROM DATE '2011-05-17') "day" 
  FROM DUAL;

例二:

SELECT EXTRACT(day FROM dt2-dt1) "day", 
       EXTRACT(hour FROM dt2-dt1) "hour", 
       EXTRACT(minute FROM dt2-dt1) "minute", 
       EXTRACT(second FROM dt2-dt1) "second" 
FROM (SELECT TO_TIMESTAMP('2011-02-04 15:07:00',
                          'yyyy-mm-dd hh24:mi:ss') dt1, 
             TO_TIMESTAMP('2011-05-17 19:08:46',
                          'yyyy-mm-dd hh24:mi:ss') dt1 
      FROM DUAL);

FROM_TZ语法:FROM_TZ(x,time_zone)
说明:把指定的时间戳和日期转换为timestamp with time zone类型

例句:

SELECT FROM_TZ(TO_TIMESTAMP('19880719','YYYYMMDD'),
               'America/Sao_Paulo')
  FROM DUAL;

TO_DSINTERVAL语法:TO_DSINTERVAL(C)
说明:将符合特定格式的字符串C转换成INTERVALDAY TO SECOND类型的数据

例句:

SELECT SYSDATE + TO_DSINTERVAL('1000:00:00') A
  FROM DUAL;

TO_TIMESTAMP语法:TO_TIMESTAMP(x[,format])
说明:把字串表达式X转换成timestamp类型可以使用format指定格式

例句:

SELECT TO_TIMESTAMP('19880719','YYYYMMDD')
  FROM DUAL;

TO_TIMESTAMP_TZ语法:TO_TIMESTAMP_TZ(x[,format])
说明:把字串表达式X转换成timestamp with time zone类型可以使用format指定格式

例句:

SELECT TO_TIMESTAMP_TZ('1988-07-19 07:10:10.12320', 
                       'YYYY-MM-dd HH24:MI:SS.FF') A
  FROM DUAL;

TO_YMINTERVAL语法:TO_YMINTERVAL(C)
说明:将符合特定格式的字符串C转换成INTERVALYEAR TO MONTH类型的数据

例句:

SELECT SYSDATE+TO_YMINTERVAL('01-13') A
  FROM DUAL;

TZ_OFFSET语法:TZ_OFFSET(time_zone)
说明:按照最小时哈分钟返回time_zone的偏置时间

例句:

SELECT TZ_OFFSET('America/New_York')
  FROM DUAL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值