Select Oracle 中的入围时区列表

Select shortlisted timezone list in Oracle

我知道这个查询 return Oracle 中所有可能的时区

select distinct tzname d, tzname r
from V$TIMEZONE_NAMES
order by 1

但这给出了 597 行,用户很难选择最喜欢的。

有没有办法 select 像 here

这样的入围名单

我正在使用 Oracle 21c 和 Oracle APEX。

您可以为每个位置找到一个不同的时区,然后为每个地区的每个时区找到一个时区名称:

SELECT region,
       tzname,
       tzabbrev
FROM   (
  SELECT region,
         tzname,
         tzabbrev,
         ROW_NUMBER() OVER (
           PARTITION BY region, tzabbrev
           ORDER BY tzname
         ) AS region_tz_rn
  FROM   (
    SELECT SUBSTR(TZNAME, 1, INSTR(TZNAME, '/') - 1) AS region,
           TZNAME,
           TZABBREV,
           ROW_NUMBER() OVER (
             PARTITION BY tzname
             ORDER BY
               -- Prefer named time zone over a UTC offset and, if possible, ignore LMT.
               CASE 
               WHEN TZABBREV = 'LMT' -- Local Mean Time
               THEN 2
               WHEN TZABBREV LIKE '-%' OR TZABBREV LIKE '+%'
               THEN 1
               ELSE 0
               END,
               TZABBREV
           ) AS tz_rn
    FROM   V$TIMEZONE_NAMES
  )
  WHERE  tz_rn = 1
)
WHERE  region_tz_rn = 1;

从 2000 多个原始条目过滤到大约 200 行:

REGION TZNAME TZABBREV
Africa Africa/Casablanca +00
Africa Africa/Juba CAST
Africa Africa/Blantyre CAT
Africa Africa/Algiers CEST
Africa Africa/Addis_Ababa EAT
Africa Africa/Cairo EEST
Africa Africa/Abidjan GMT
Africa Africa/Johannesburg SAST
Africa Africa/Ndjamena WAST
Africa Africa/Bangui WAT
America America/Scoresbysund +00
America America/Noronha -01
America America/Araguaina -02
... ... ...
US US/Alaska AHDT
US US/Aleutian AHST
US US/Central CDT
US US/Michigan CST
US US/Eastern EDT
US US/Hawaii HDT
US US/Arizona MDT
US US/Pacific PDT
US US/Samoa SST
null Kwajalein +09
null NZ-CHAT +1215
null GB BDST
null Eire BST
null CST CDT
null CET CEST
null EST5EDT EDT
null EET EEST
null EST EST
null GMT GMT
null Hongkong HKST
null HST HST
null Israel IDDT
null Japan JDT
null ROK JST
null MST7MDT MDT
null MET MEST
null MST MST
null NZ NZDT
null PST PDT
null Singapore SMT
null Iran TMT
null UCT UTC
null WET WEST

如果你想过滤得更多,那么你可以找到等效的时区并将它们聚合(即 +00UTCGMT 是等效的,可以合并)。

db<>fiddle here