如何返回DBTIMEZONE名称

时间:2017-03-22 22:26:07

标签: sql oracle

我跑了

select dbtimezone, sessiontimezone
from dual

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

我也跑了

select
  TZ_OFFSET('US/Eastern') "EST_offset",
  TZ_OFFSET('America/Denver') "Mtn Time offset"
from dual

返回相同的数字。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

首先,你为什么要DBTIMEZONE?我无法想象为什么有人会需要它。 DBTIMEZONE仅与TIMESTAMP WITH LOCAL TIME ZONE列相关,它定义了存储格式。

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

SELECT TO_CHAR(SYSTIMESTAMP, 'TZR') FROM dual;

与您的实际问题相关:不,这是不可能的。时区-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

-04:00US/Eastern之间的市长区别为:US/Eastern等时区区域适用夏令时,-04:00则不适用。

无论是夏季还是冬季,

-04:00总是超过UTC 4小时。

Documentation for TZ_OFFSET说" 根据语句执行的日期返回与输入值对应的时区偏移量"

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

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

答案 1 :(得分:0)

来自Oracle Community thread的答案:

  

问:如何找出数据库的time_zone是什么?

     

答:您的意思是系统时区(EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP))还是数据库时区(DBTIMEZONE)?这些是用于不同目的的不同值。

     

Oracle数据库不知道系统时区的区域名称。 Oracle数据库通过从本地时间减去UTC时间来确定系统时区,这两者都是从操作系统中检索的。计算的差异是偏移形式的系统时区。当夏令时在操作系统中生效时,偏移会自动更改。 您必须使用可用的数据库接口之一直接从操作系统检索时区区域名称(Java,外部C标注,在主机上启动的本地Web服务以及通过UTL_HTTP等。)

     

数据库时区在数据库创建时确定,默认为'00:00'。如果设置为偏移量,DBTIMEZONE将返回偏移量。如果将其设置为区域名称,则DBTIMEZONE将返回区域名称。我建议将数据库时区保留为偏移'00:00',以便TIMESTAMP WITH LOCAL TIME ZONE可用于存储UTC规范化的时间值。