簡體   English   中英

Oracle SQL:將時間戳轉換為UTC

[英]Oracle SQL: converting timestamp to UTC

我有一個簡單的選擇查詢,如下所示,但我注意到我回到了區域時間。 如何在我選擇的陳述中轉換為UTC?

select myTimeStamp, MyName, MyBranch from tableA

結果:“ 27/03/2014 15:15:26”“約翰”,“倫敦”

我嘗試使用sys_extract_utc(myTimeStamp),但出現錯誤

sql命令未正確結束

myTimestamp列的類型為“ date”。

select cast(mytimestamp as timestamp) at time zone 'UTC', 
       MyName, 
       MyBranch 
from tableA

因為mytimestamp實際上是date而不是時間戳,所以您需要轉換它。 這樣做使Oracle假定存儲在mytimestamp中的信息位於服務器的時區中-如果不是這種情況,則需要使用Madhawas的解決方案。

根據類型,根據myTimestamp的數據類型,Oracle從哪個時區轉換有一些陷阱。

帶時區的時間戳

It Just Works™。 a_horse_with_no_name在這里有正確的答案。

帶本地時區的時間戳

它被隱式轉換為帶時區的時間戳 ,然后是Just Just™。 同樣, a_horse_with_no_name就在這里。

時間戳記

盡管它也被隱式轉換為帶有時區的時間戳 ,但默認情況下分配的時區是會話時區(與數據庫時區相反)。

  • 對此的顯式調用是myTimestamp at local
  • 另外(可能更好),您可以按照Madhawas所說的做,並使用from_tz函數顯式地建立一個具有與會話不同的顯式時區的值。

日期

到目前為止 ,嘗試執行上述任何操作都會失敗,如下所述:

  • myTimestamp at time zone 'UTC'
    ORA-30084:具有時區修飾符的datetime主數據類型無效

  • from_tz(myTimestamp, 'America/New_York')
    ORA-00932:數據類型不一致:預期的時間戳記是DATE

這里的解決方案是首先將日期轉換為時間戳

select from_tz(cast(myTimestamp as timestamp), 'America/New_York') from tableA

樣例腳本

以下腳本說明了該行為。 請注意,在我的系統上, dbtimezone是美國/中央,而sessiontimezone是GMT-05:00。

我還使用to_char來轉換輸出,因為我發現某些工具會以微妙的方式更改結果時間戳,尤其是如果它們沒有良好的時間戳支持(如今很少見,但仍然可能是一個問題)。

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'
/
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS'
/
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZR'
/

select dbtimezone
      ,sessiontimezone
      ,to_char(timestamp '2017-01-01 06:00:00') as ts
      ,to_char(timestamp '2017-01-01 06:00:00' at local) as ts_at_local
      ,to_char(timestamp '2017-01-01 06:00:00' at time zone dbtimezone) as ts_at_db
      ,to_char(timestamp '2017-01-01 06:00:00' at time zone sessiontimezone) as ts_at_session
 from dual
/

我的系統上的輸出如下(為了便於閱讀,將其重新格式化為列式):

DBTIMEZONE          US/Central
SESSIONTIMEZONE     -05:00
TS                  2017-01-01 06:00:00
TS_AT_LOCAL         2017-01-01 06:00:00 -05:00
TS_AT_DB            2017-01-01 05:00:00 US/CENTRAL
TS_AT_SESSION       2017-01-01 06:00:00 -05:00

您需要知道您的時區;

SELECT myTimeStamp, from_tz(myTimeStamp, 'America/New_York') AT TIME ZONE 'UTC' utc FROM dual;

從Oracle 19c開始,引入了一個新函數TO_UTC_TIMESTAMP_TZ

SQL函數TO_UTC_TIMESTAMP_TZ將ISO 8601日期格式的字符串作為varchar輸入,並返回SQL數據類型TIMESTAMP WITH TIMEZONE的實例。 它將輸入標准化為UTC時間(協調世界時,以前為格林威治標准時間)。 與SQL函數TO_TIMESTAMP_TZ不同,新函數假定輸入字符串使用ISO 8601日期格式,默認時區為UTC 0。

select TO_UTC_TIMESTAMP_TZ ( to_char(sysdate,'yyyy-mm-dd"T"HH:MI:SS') )  as utc 
   from dual;

 UTC
31-MAR-19 05.45.36.000000 AM +00:00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM