Oracle 時區
Table of Contents
1 簡介
因爲地球經緯度及地球自轉引發的經度方向,不一樣的經度的地方,所感覺到的晝夜是不一樣 的。有關國際會議決定將地球表面按經線從東到西,每隔經度15度劃分一個時區,而且規定 相鄰區域的時間相差1小時。 css
這就是時區的由來。 html
而實際使用中,每每不是嚴格按照這個標準來作的。國家的存在,爲了行政工做的方便,一 個國家都有一個本國的標準時,大部分國家以首都所在的時區做爲國家的標準時。好比, 我大中國以北京所在時區(東八區)做爲中國的標準時。在IT領域,不少時候咱們都會涉及 到時區的問題。很不幸的是,不少計算機方面的標準都是西歐、北美這些發達國家定製 的.好比東八區的時區名,並非Beijing,而是Shanghai,固然,完整的時區名應該是 "Asia/Shanghai". java
1884年在華盛頓召開的國際經度會議決定以通過格林尼治的經線爲本初子午線,是世界計 算時間和地理經度的起點,也是世界標準時,又稱其爲格林尼治標準時, 其時區名爲 UT. 而因爲世界原子時(納秒爲基礎)與世界時(毫秒爲基礎)的計算單位不一樣,二者之間的差異會 愈來愈大,各政府更傾向於以天然時間UT爲標準,所以世界原子時須要向世界時靠攏,於 1972年,世界上達成一致解決方案即爲:協調世界時,即UTC。隨後UTC,即成爲了各個領 域特別是IT行業的時間標準。 python
而UTC的由來,不過是國力強弱之爭妥協的產物。英文(CUT)和法文(TUC)的縮寫不一樣, 做爲妥協,簡稱UTC。 sql
不少同仁在工做時,不會特別關注時區問題,即便用默認的時間配置,而在處理實際數據 的時候才發現,操做時間或者系統顯示時間與本地時間相差了幾個小時,在我大中國,一 般就是相差8個小時。只要你遇到了反饋時間與實際時間相差8個小時的狀況,你就往時區 方面去考慮,這個方向基本上是正確的。 shell
2 Oracle TimeZone
2.1 時區文件
Oracle 將支持的時區信息,好比時區名,時區縮寫名都保存在文件中。文件的默認存儲 路徑爲$ORACLE_HOME/oracore/zoneinfo/ 及其子路徑中(big和little). 這些路徑中中的 同名文件,實際上是同樣的。都是二進制文件,可是從文件大小來看,能夠判斷,同名文件 雖然在不一樣的路徑中,可是文件內容是同樣的。 數據庫
文件的內容,在數據庫啓動時,會自動加載,並呈如今視圖"V$TIMEZONE_FILE" 中,告知我 們, 數據庫如今使用的是哪一個文件。 sass
文件分爲兩種類型:timezlrg_version.dat和timezone_version.dat . ruby
2.2 時區名字
關於Oracle支持的時區,基本上涵蓋了已知的經常使用的時區。 bash
數據庫啓動時經過文件加載的內容,呈如今視圖:V$TIMEZONE_NAMES 中。
SQL> col tzname for a20 SQL> col tzabbrev for a10 SQL> select * from V$TIMEZONE_NAMES where tzname = 'Asia/Shanghai'; TZNAME TZABBREV -------------------- ---------- Asia/Shanghai LMT Asia/Shanghai CST Asia/Shanghai CDT
能夠看到查到了三個值,
- LMT(Local Mean Time)
- 全球標準時間,UTC的前身, 這個基本不用了。
- CST(China Standard Time)
- 中國標準時間, 有其餘的解釋
- CDT(Central Daylight Time)
- 中部夏令時間,主要用於北美,比UTC晚5小時。另外,還能夠理解成(Cuba Daylight Time)古巴夏令時。
更多的時區查詢能夠去:https://datetime360.com/cn/worldwide-city-list/ 查詢。
因爲縮寫中有不少同名的,爲了不衝突,咱們通常使用全名。
2.3 查詢數據庫或者會話時區
會話
select sessiontimezone from dual; SESSIONTIMEZONE --------------------------------------------------------------------------- +08:00
數據庫
select dbtimezone from dual; DBTIME ------ +00:00 SELECT property_name, property_value FROM database_properties WHERE property_name='DBTIMEZONE'; SELECT name, value$ FROM sys.props$ WHERE name='DBTIMEZONE';
2.4 調整時區
- 會話級別
SQL 命令
ALTER SESSION SET TIME_ZONE = local; ALTER SESSION SET TIME_ZONE = dbtimezone; ALTER SESSION SET TIME_ZONE = '+08:00'; ALTER SESSION SET TIME_ZONE = 'Asia/Shanghai';
環境變量
$ ORA_SDTZ='-05:00' $ export ORA_SDTZ
數據庫級別 須要重啓
ALTER DATABASE SET TIME_ZONE = '-05:00'; ALTER DATABASE SET TIME_ZONE = 'Europe/Lisbon';
建立數據庫時指定時區
CREATE DATABASE ... SET TIME_ZONE='Asia/Shanghai';
2.5 查詢在指定時區的當地時間
SELECT TZ_OFFSET('Europe/London') FROM DUAL;