管理不同時區的資料

brj880719發表於2017-10-18

一、設定時區

1、資料庫時區
 a) 修改
  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';
 b) 驗證
  SELECT DBTIMEZONE FROM DUAL;
2、會話時區
 a) 修改
  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';
 b) 驗證
  SELECT SESSIONTIMEZONE FROM DUAL;

二、時間資料型別

函式 說明
CURRENT_DATE 語法:CURRENT_DATE()
說明:查詢當前時間
current_date返回的是當前會話時間,而sysdate返回的是伺服器時間。
current_date有時比sysdate快一秒,這可能是四捨五入的結果。
如果修改當前會話的時區,比如將中國的時區為東八區,修改為東九區,則current_date顯示的時間為東九區時間,根據東加西減的原則,current_date應該比sysdate快一小時。
例句:
  1. select current_date, sysdate from dual;
CURRENT_TIMESTAMP 語法:CURRENT_TIMESTAMP()
說明:以timestamp with time zone資料型別返回當前會話時區中的當前日期
例句:
  1. SELECT CURRENT_TIMESTAMP
  2.   FROM DUAL;
LOCALTIMESTAMP 語法:LOCALTIMESTAMP()
說明:以本地timestamp資料型別返回當前會話時區中的當前日期
例句:
  1. SELECT LOCALTIMESTAMP
  2.   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;
例句:
例一:
  1. SELECT EXTRACT(year FROM DATE '2011-05-17') "year",
  2. EXTRACT(month FROM DATE '2011-05-17') "month",
  3. EXTRACT(day FROM DATE '2011-05-17') "day"
  4. FROM DUAL;
例二:
  1. SELECT EXTRACT(day FROM dt2-dt1) "day",
  2.        EXTRACT(hour FROM dt2-dt1) "hour",
  3.        EXTRACT(minute FROM dt2-dt1) "minute",
  4.        EXTRACT(second FROM dt2-dt1) "second"
  5. FROM (SELECT TO_TIMESTAMP('2011-02-04 15:07:00',
  6.                           'yyyy-mm-dd hh24:mi:ss') dt1,
  7.              TO_TIMESTAMP('2011-05-17 19:08:46',
  8.                           'yyyy-mm-dd hh24:mi:ss') dt1
  9.       FROM DUAL);
FROM_TZ 語法:FROM_TZ(x,time_zone)
說明:把指定的時間戳和日期轉換為timestamp with time zone型別
例句:
  1. SELECT FROM_TZ(TO_TIMESTAMP('19880719','YYYYMMDD'),
  2.                'America/Sao_Paulo')
  3.   FROM DUAL;
TO_DSINTERVAL 語法:TO_DSINTERVAL(C)
說明:將符合特定格式的字串C轉換成INTERVALDAY TO SECOND型別的資料
例句:
  1. SELECT SYSDATE + TO_DSINTERVAL('1000:00:00') A
  2.   FROM DUAL;
TO_TIMESTAMP 語法:TO_TIMESTAMP(x[,format])
說明:把字串表示式X轉換成timestamp型別可以使用format指定格式
例句:
  1. SELECT TO_TIMESTAMP('19880719','YYYYMMDD')
  2.   FROM DUAL;
TO_TIMESTAMP_TZ 語法:TO_TIMESTAMP_TZ(x[,format])
說明:把字串表示式X轉換成timestamp with time zone型別可以使用format指定格式
例句:
  1. SELECT TO_TIMESTAMP_TZ('1988-07-19 07:10:10.12320',
  2.                        'YYYY-MM-dd HH24:MI:SS.FF') A
  3.   FROM DUAL;
TO_YMINTERVAL 語法:TO_YMINTERVAL(C)
說明:將符合特定格式的字串C轉換成INTERVALYEAR TO MONTH型別的資料
例句:
  1. SELECT SYSDATE+TO_YMINTERVAL('01-13') A
  2.   FROM DUAL;
TZ_OFFSET 語法:TZ_OFFSET(time_zone)
說明:按照最小時哈分鐘返回time_zone的偏置時間
例句:
  1. SELECT TZ_OFFSET('America/New_York')
  2.   FROM DUAL;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24851054/viewspace-2146094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章