我跑了
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 语句来创建这种关系?
谢谢!
首先,你为什么喜欢得到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:00和US/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或地区名称。