此處我試圖將日期列值從CET
轉換爲CST
。 我嘗試使用NEW_TIME(SYSDATE ,'CET','CST')
函數,但它給出了一個錯誤,說明未知的時區。這裏的問題是CET
不被oracle認爲是有效的時區。如何在SQL查詢中將列時區從CET轉換爲CST
我最初嘗試使用「at timezone」方法,但它將時區名稱插入列值中,我不想要。
此處我試圖將日期列值從CET
轉換爲CST
。 我嘗試使用NEW_TIME(SYSDATE ,'CET','CST')
函數,但它給出了一個錯誤,說明未知的時區。這裏的問題是CET
不被oracle認爲是有效的時區。如何在SQL查詢中將列時區從CET轉換爲CST
我最初嘗試使用「at timezone」方法,但它將時區名稱插入列值中,我不想要。
三個字符時區不調整爲夏令時。爲此,您需要使用完全指定的時區名稱。舉例來說,在加拿大有一箇中央標準時間,但薩斯卡特溫省沒有使用夏令時,所以如果我想現在就轉換到夏令時的夏令時間,並且知道正確的完全指定的時區在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
要刪除時區,您可以使用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;
像寶石一樣工作,但我在它的文檔中看到,它不會針對白天的節能時間進行調整,無論如何我們都可以在相同的功能中調整它。 –
下面添加了一個答案,以顯示如何處理夏令時。它要求你知道的不僅僅是你的語言環境的縮寫時區。 –
以上時區轉換方法適用於SELECT查詢,但是當我在INSERT查詢中使用它時,它將插入普通的SYSDATE值而不是轉換後的值。 –
@ MichaelBroughton:以上時區轉換方法適用於SELECT查詢,但是當我在INSERT查詢中使用它時,它將插入純正的SYSDATE值而不是轉換後的值。 –
更新了答案,以幫助你解決這個問題 –