簡體   English   中英

如何從 Oracle 獲取時區 ID 而不是時區偏移

[英]How to get the timezone ID from Oracle instead timezone offset

有沒有辦法從 oracle 獲取時區 ID 而不是時區偏移量? 當我執行SELECT SYSTIMESTAMP AS TIMEZONE FROM DUAL; 返回的結果是13-JAN-21 10.19.52.936031000 AM +05:30

當我使用rs.getObject( "TIMEZONE ", ZonedDateTime.class )從 Java 檢索此內容時, ZonedDateTime ZA8CFDE6331BD59EB2AC96F8911C4B605Z 的offsetzoneID設置為 +056 +05:30

但我希望看到的是, SELECT SYSTIMESTAMP AS TIMEZONE FROM DUAL; 應返回04-JAN-21 02.40.50.000000000 PM ASIA/COLOMBO並且查詢的 Java ZonedDateTime 應將offset設置為+05:30並將zoneID設置為Asia/Colombo

有沒有辦法在數據庫級別或 Java 級別進行設置? 當前DBTIMEZONE設置為+05:30

如果數據已經在 Oracle SQL 表中,並且您必須轉換為帶有時區的時間戳(例如,在您在同一個表中創建的新列中),則不需要將 Z34D1F91FB2E7 或 514B867BZFAB 顯式轉換為 OS1使用 Java 或任何其他東西,除了 Oracle 數據庫本身。

從您的問題中不清楚您是否必須假設“日期”是在服務器時區(您提到“數據庫”,通常表示服務器)或客戶端時區(您提到“會話”,這意味着客戶端)。 無論哪種方式:

update <your_table>
set <timestamp_with_time_zone_col> = 
            from_tz(cast<date_col> as timestamp, dbtimezone)
;

或者使用 sessiontimezone 作為第二個參數,如果你需要的話。

這假設數據庫(和/或會話)時區在數據庫中正確設置,分別在客戶端中。 如果不是/它們不是,則需要先修復。 如果首先正確設置參數,Oracle 完全能夠處理日間節省時間。 (如果不是,則不清楚為什么您會嘗試讓您的操作比數據庫最初支持的“更正確”。)

示例:在下面的 WITH 子句中,我模擬了一個具有數據類型 date 的列 dt 的表。 然后我將其轉換為帶有時區的時間戳,在我的會話(客戶端)時區。

with
  my_table ( dt ) as ( 
    select to_date('2018-06-20 14:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual 
  )
select dt,
       from_tz(cast(dt as timestamp), sessiontimezone) as ts_with_tz
from   my_table
;

DT                  TS_WITH_TZ                                       
------------------- -------------------------------------------------
2018-06-20 14:30:00 2018-06-20 14:30:00.000000000 AMERICA/LOS_ANGELES

供參考您可以檢查此鏈接StackOverflow 參考。 關聯

從某種意義上說,你運氣不好。 SYSTIMESTAMP只返回您的操作系統報告的內容。 時區是托管數據庫的計算機系統的時區。 不是數據庫時區(可能與數據庫實際所在的位置完全無關)或 session 時區或類似的東西。 如果可以,您將需要在 db 主機操作系統本身中進行更改。

如果您確定托管您的數據庫的系統位於斯里蘭卡,那么您可以像這樣間接獲得您想要的東西:

select systimestamp AT TIME ZONE 'ASIA/COLOMBO' from dual;

您可以使用ALTER database命令在數據庫級別設置時區,如下所示:

alter database set time_zone = '+05:30';

請注意,這將在您重新啟動數據庫后生效。

shutdown immediate
startup

SYSTIMESTAMP在數據庫操作系統的時區中返回 - 因此無法在數據庫中更改它。

不要將數據庫操作系統的時區與DBTIMEZONE ,它們是不同的。

另請注意, Asia/Colombo時區與+05:30時區不同,盡管它們(當前)具有相同的 UTC 偏移量。

時區Asia/Colombo考慮夏令時以防萬一,它還涵蓋了更改 例如, Asia/Colombo在 2006 年從 UTC+06:00 更改為 UTC+05:30。 例如,因此TZ_OFFSET(TIMESTAMP '2020-01-01 12:00:00 Asia/Colombo')返回與TZ_OFFSET(TIMESTAMP '2000-01-01 12:00:00 Asia/Colombo')不同的偏移量。

時區+05:30始終是 UTC 之前的 5:30。

你的問題不是很清楚,你想得到什么?

Oracle TZ_OFFSET() function 返回有效時區名稱或 SESSIONTIMEZONE 或 DBTIMEZONE ZC1C425268E683854F14ZA 名稱的 UTC 的時區偏移量。

TZ_OFFSET(value)

他 TZ_OFFSET() function 接受一個參數,該參數可以是有效的時區名稱,例如“歐洲/倫敦”、SESSIONTIMEZONE 或 DBTIMEZONE 的 function 名稱或與 UTC 的時區偏移量(僅返回自身)。

SELECT
  TZ_OFFSET( 'Europe/London' )
FROM
  DUAL;

結果將是 +01:00

這就是你如何獲得時區。

SELECT systimestamp AS DBTime,
       systimestamp at time zone 'Europe/London',
       systimestamp at time zone 'America/Sao_Paulo'from dual;

SELECT
  TZ_OFFSET( DBTIMEZONE )
FROM
  DUAL;

暫無
暫無

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

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