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
如果你想过滤得更多,那么你可以找到等效的时区并将它们聚合(即 +00
、UTC
、GMT
是等效的,可以合并)。
db<>fiddle here
我知道这个查询 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
如果你想过滤得更多,那么你可以找到等效的时区并将它们聚合(即 +00
、UTC
、GMT
是等效的,可以合并)。
db<>fiddle here