很多人都知道,在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...