2016-02-03 57 views
1

此處我試圖將日期列值從CET轉換爲CST。 我嘗試使用NEW_TIME(SYSDATE ,'CET','CST')函數,但它給出了一個錯誤,說明未知的時區。這裏的問題是CET不被oracle認爲是有效的時區。如何在SQL查詢中將列時區從CET轉換爲CST

我最初嘗試使用「at timezone」方法,但它將時區名稱插入列值中,我不想要。

回答

0

三個字符時區不調整爲夏令時。爲此,您需要使用完全指定的時區名稱。舉例來說,在加拿大有一箇中央標準時間,但薩斯卡特溫省沒有使用夏令時,所以如果我想現在就轉換到夏令時的夏令時間,並且知道正確的完全指定的時區在DB時區的文件名(你可以檢查*從V $ TIMEZONE_NAMES安裝在你的數據庫通過選擇列表):

SELECT 'Central' locale 
     , extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Central') tz_abbrv 
     , CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Central' as timestamp) local_time from dual 
union all 
SELECT 'Saskatchewan' locale 
     , extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Saskatchewan') tz_abbrv 
    , CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Saskatchewan' as timestamp) local_time from dual; 

LOCALE  TZ_ABBRV LOCAL_TIME       
Central  CDT  03/08/2016 9:57:24.000000 AM   
Saskatchewan CST  03/08/2016 8:57:24.000000 AM   

否則,你將需要代碼時,在你的計算CST和DST之間切換 - 同時銘記夏令時開始和結束的規則隨着時間的推移而改變,並且未來可能再次改變。因此,您需要首先確保將列定義爲包含時區(數據類型「timestamp with timezone」),並將CAST從「timestamp」更改爲「帶時區的時間戳」 「以確保該區域的信息存儲:

如)

create table mbt (stz timestamp with time zone) 

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Indian/Maldives' as timestamp with time zone)) 

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Eastern' as timestamp with time zone)) 

commit; 

select * from mbt; 

STZ           
05/08/2016 8:06:49.000000 PM +05:00   
05/08/2016 11:06:50.000000 AM -04:00  

如果不包含WITH TIME ZONE你仍然應該得到改變的值,但是你不能很容易從當地時間轉換到不同的時區,因爲這些值將假定在服務器時區:

drop table mbt; 

create table mbt (stz timestamp); 

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Indian/Maldives' as timestamp)); 

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Eastern' as timestamp)); 

commit; 

select * from mbt; 


STZ        
------------------------------- 
05-AUG-16 08.13.16.000000 PM 
05-AUG-16 11.13.16.000000 AM 
+0

@ MichaelBroughton:以上時區轉換方法適用於SELECT查詢,但是當我在INSERT查詢中使用它時,它將插入純正的SYSDATE值而不是轉換後的值。 –

+0

更新了答案,以幫助你解決這個問題 –

0

要刪除時區,您可以使用cast(.... as Timesamp)。 檢查我的例子。

select cast(current_timestamp at time zone 'CST' as timestamp), cast(current_timestamp at time zone 'CST' as timestamp with time zone) from dual;

+0

像寶石一樣工作,但我在它的文檔中看到,它不會針對白天的節能時間進行調整,無論如何我們都可以在相同的功能中調整它。 –

+0

下面添加了一個答案,以顯示如何處理夏令時。它要求你知道的不僅僅是你的語言環境的縮寫時區。 –

+0

以上時區轉換方法適用於SELECT查詢,但是當我在INSERT查詢中使用它時,它將插入普通的SYSDATE值而不是轉換後的值。 –