一些字符串操作和以下内容的组合应该会让你接近
首先,您需要提取提供的偏移量:
select regexp_replace( 'GMT+5.5_(INDIA)'
, '[[:alpha:]]{3}(-|\+)(\d+)(\.(\d+))?.*'
, '\1\2\3')
from dual
然后,您需要将其转换为正确的格式。假设正则表达式为您提供了名为 s 的内容,那么:
with setup as (
select to_number(s) as n from ...
)
select case when n < 0 then '-' else '+' end
|| lpad(trunc(n), 2, '0')
|| ':'
|| lpad((n - trunc(n)) * 60, 2, '0') as offset
from dual
最后,您可以使用TZ_OFFSET 来查询我们的视图,以返回所有 个有效时区区域。
select tzname
from v$timezone_names
where tzoffset(tzname) = :offset
如果您想选择一个时区,您需要创建一些额外的逻辑来描述您希望选择的时区。
在单个查询中,这看起来很难看,但会像
with strip_characters as (
select to_number(regexp_replace( 'GMT+5.5_(INDIA)'
, '[[:alpha:]]{3}(-|\+)(\d+)(\.(\d+))?.*'
, '\1\2\3'))
from dual
)
, setup as (
select case when n < 0 then '-' else '+' end
|| lpad(trunc(n), 2, '0')
|| ':'
|| lpad((n - trunc(n)) * 60, 2, '0') as offset
from strip_characters
)
select t.tzname
from v$timezone_names t
join setup s
where tzoffset(t.tzname) = s.offset