怎樣在Oracle 9i中正確的轉換時區

2021-06-22 12:02:38 字數 1504 閱讀 9637

很多人都知道,在oracle 9i之前,雖然有乙個new_time函式可以改變date的時間戳部分,但是還沒有專門用來儲存時區資訊的資料型別。在oracle9i中,我們可以使用dbtimezone偽欄位查詢資料庫的時區,使用sessiontimezone偽欄位查詢會話的時區。

但是,對於大多數資料庫,這些值都是-07:00之類的偏移值,因此對於new_time函式是沒有用的。oracle9i有關new_time的文件建議使用from_tz來替代,但是這可能會產生誤導。from_tz只將乙個時區應用到乙個時間戳上;它並不能把乙個時區轉換成另外乙個時區。

其實有乙個比較好的方法(從文件中得到這個方法可能有點難)。首先,為了完成這個工作,在正確的時區內需要乙個timestamp with zone資料型別。然後,如果你將關鍵字at time zone應用到那個值,它就會自動地調整為新的時區和日期。

select (timestamp 2003-04-06 01:59:59 at time zone pdt)

at time zone gmt

from dual;

06-apr-03 08.59.59.00000000 am gmt

這個語句將為太平洋白天時間(即其切換到pst之前的時刻)構造乙個timestamp with time zone然後再將其轉換到gmt。at time zone關鍵字也接受預設的偏移值語法:

select (timestamp 2003-04-06 02:00:00

at time zone -07:00) at time zone

00:00 from dual;

06-apr-03 09.00.00.000000000 am +00:00

你還可以使用偽字段來自動調整當前會話的時區:

selectcurrent_timestamp at time zone dbtimezone from dual;

上面的表示式返回乙個當前會話的本地時間(資料型別為時區),重新調整資料庫的時區,調整後的時區將與systimestamp的結果相等。

有了以上的這些資訊,就可以構造乙個比較好的new_time函式:

create or replace function my_new_time

p_dwtz timestamp with time zone,

p_tz varchar2

) return date

isbegin

return cast(p_dwtz at time zone p_tz as date);

end my_new_time;

show errors;

select my_new_time(sysdate,+08:00) from dual;

如果第乙個引數被標記為乙個timestamp with time zone,你可以傳入乙個timestamp和date,這樣由於oracle的自動轉型操作,得到的時間將是會話在本地時區的當前時間。這個函式接受包括偏移值在內的任何可以被timestamp識別的時區,然後將接受的時區調整為正確的值。

上海阜和進修學校

解除安裝Oracle 9i

1 停止所有oracle服務 2 刪除登錄檔中的所有關於oracle項 1 在hkey local machine software下,刪除oracle目錄 2 在hkey local machine system controlset001 services下,刪除所有oracle項 3 在hke...

oracle9i解除安裝

今天裝了oracle 9i,後來重灌遇到問題因為解除安裝未乾淨。幾經周折終於成功,現將解除安裝步驟供以後參考 1 停止服務 開啟 服務 然後停止所有oracle服務 2 刪除程式 3 刪除登錄檔中的所有關於oracle項 1 在hkey local machine software下,刪除oracl...

oracle9i解除安裝

今天裝了oracle 9i,後來重灌遇到問題因為解除安裝未乾淨。幾經周折終於成功,現將解除安裝步驟供以後參考 1 停止服務 開啟 服務 然後停止所有oracle服務 2 刪除程式 3 刪除登錄檔中的所有關於oracle項 1 在hkey local machine software下,刪除oracl...