如何返回 DBTIMEZONE 名称

Car*_*Ben 2 sql oracle

我跑了

select dbtimezone, sessiontimezone
from dual
Run Code Online (Sandbox Code Playgroud)

分别返回 -04:00 和 -06:00。

我也跑了

select
  TZ_OFFSET('US/Eastern') "EST_offset",
  TZ_OFFSET('America/Denver') "Mtn Time offset"
from dual
Run Code Online (Sandbox Code Playgroud)

返回相同的数字。

我的问题是,如何将“-04:00”转换为“美国/东部”之类的内容?是否有我忽略的简单内置函数,或者我是否需要编写自己的 CASE 语句来创建这种关系?

谢谢!

Wer*_*eit 5

首先,你为什么喜欢得到DBTIMEZONE?我无法想象有人需要它的任何理由。DBTIMEZONE 仅与 TIMESTAMP WITH LOCAL TIME ZONE 列相关,它定义了存储格式。

我假设您对数据库服务器操作系统的时区更感兴趣。这你可以选择

SELECT TO_CHAR(SYSTIMESTAMP, 'TZR') FROM dual;
Run Code Online (Sandbox Code Playgroud)

与您的实际问题相关:不,这是不可能的。时区-04:00与时区不同US/Eastern。还有许多其他时区区域也有 4 小时的 UTC 偏移量,请参阅此查询:

SELECT DISTINCT tzname
FROM V$TIMEZONE_NAMES
WHERE TRIM(TRAILING CHR(0) FROM TZ_OFFSET(tzname)) = '-04:00';

TZNAME
=========================================
America/Anguilla
America/Aruba
America/Asuncion
America/Boa_Vista
America/Caracas
America/Cuiaba
America/Curacao
America/Detroit
America/Fort_Wayne
America/Guadeloupe
America/Indiana/Indianapolis
America/Indiana/Marengo
America/Indiana/Vevay
America/Indianapolis
America/Iqaluit
America/Kentucky/Louisville
America/La_Paz
America/Louisville
America/Manaus
America/Martinique
America/Montreal
America/Montserrat
America/New_York
America/Porto_Velho
America/Puerto_Rico
America/Santiago
America/St_Thomas
America/Thunder_Bay
America/Tortola
America/Virgin
Brazil/West
Canada/Eastern
Chile/Continental
EST5EDT
Etc/GMT+4
US/East-Indiana
US/Eastern
US/Michigan
Run Code Online (Sandbox Code Playgroud)

之间的区别市长-04:00US/Eastern是:像时区区域US/Eastern应用夏令时间,-04:00没有。

-04:00 无论是夏季还是冬季,总是比 UTC 晚 4 小时。

TZ_OFFSET 的文档说“根据执行语句的日期,返回与输入值相对应的时区偏移量

因此,如果您在TZ_OFFSET('US/Eastern')两周前执行,结果将是-05:00.

您可以将数据库服务器操作系统的时区更改为US/Eastern. 但是,我不知道是否TO_CHAR(SYSTIMESTAMP, 'TZR')会始终返回诸如-04:00, 或 之类的值。-05:00或地区名称。