将带缩写时区的字符串转换为时间戳
Conversion of String with Abbreviated Timezone to Timestamp
我有一个以 May 29 14:12:56 PDT 2015
格式存储为 varchar2 的时间戳。我想将其转换为 timestamp with time zone
数据类型。
如果我用,
with x(dt_string) as (
select 'May 29 14:12:56 PDT 2015' from dual
)
select dt_string,
to_timestamp_tz(dt_string,'Mon dd hh24:mi:ss TZD YYYY') dt_ts
from x;
它给了我,
DT_STRING DT_TS
------------------------ ----------------------------------------
May 29 14:12:56 PDT 2015 29-MAY-15 02.12.56.000000000 PM +00:00
时区不正确。
The TZD value is an abbreviated time zone string with daylight saving information. It must correspond with the region specified in TZR.
这是否意味着 abbreviated time zone string
应该 Time zone region
才能执行正确的转换?但是,拥有 Time zone region
将使
abbreviated time zone string
多余。不是吗?
我该如何处理?
实际上您的查询应该引发错误 ORA-01857: not a valid time zone
或 ORA-01882: timezone region not found
PDT
不是有效的时区区域,即不明确。 运行 这个查询得到不同含义的 PDT
:
SELECT tzabbrev, TZ_OFFSET(tzname), tzname
FROM v$timezone_names
WHERE tzabbrev = 'PDT'
ORDER BY 2;
TZABBREV TZ_OFFSET(TZNAME) TZNAME
PDT -06:00 America/Inuvik
PDT -07:00 US/Pacific-New
PDT -07:00 America/Ensenada
PDT -07:00 America/Dawson
PDT -07:00 America/Dawson_Creek
PDT -07:00 America/Los_Angeles
PDT -07:00 America/Tijuana
PDT -07:00 America/Vancouver
PDT -07:00 America/Whitehorse
PDT -07:00 Canada/Pacific
PDT -07:00 Canada/Yukon
PDT -07:00 Mexico/BajaNorte
PDT -07:00 PST
PDT -07:00 PST8PDT
PDT -07:00 US/Pacific
PDT -08:00 America/Juneau
您必须使用 PST
作为时区区域。然后从给定日期确定夏令时设置:
SELECT
TO_TIMESTAMP_TZ('Jan 29 14:12:56 PST 2015','Mon dd hh24:mi:ss TZR YYYY') dt_ts_winter,
TO_TIMESTAMP_TZ('Jun 29 14:12:56 PST 2015','Mon dd hh24:mi:ss TZR YYYY') dt_ts_summer
FROM dual;
DT_TS_WINTER DT_TS_SUMMER
2015-01-29 14:12:56.000000000 -08:00 2015-06-29 14:12:56.000000000 -07:00
由于您的值存储为 VARCHAR2
(现在您知道为什么不应该这样做了),您可以使用 REGEXP_REPLACE(dt_string, 'PDT', 'PST')
更改它
我有一个以 May 29 14:12:56 PDT 2015
格式存储为 varchar2 的时间戳。我想将其转换为 timestamp with time zone
数据类型。
如果我用,
with x(dt_string) as (
select 'May 29 14:12:56 PDT 2015' from dual
)
select dt_string,
to_timestamp_tz(dt_string,'Mon dd hh24:mi:ss TZD YYYY') dt_ts
from x;
它给了我,
DT_STRING DT_TS
------------------------ ----------------------------------------
May 29 14:12:56 PDT 2015 29-MAY-15 02.12.56.000000000 PM +00:00
时区不正确。
The TZD value is an abbreviated time zone string with daylight saving information. It must correspond with the region specified in TZR.
这是否意味着 abbreviated time zone string
应该 Time zone region
才能执行正确的转换?但是,拥有 Time zone region
将使
abbreviated time zone string
多余。不是吗?
我该如何处理?
实际上您的查询应该引发错误 ORA-01857: not a valid time zone
或 ORA-01882: timezone region not found
PDT
不是有效的时区区域,即不明确。 运行 这个查询得到不同含义的 PDT
:
SELECT tzabbrev, TZ_OFFSET(tzname), tzname
FROM v$timezone_names
WHERE tzabbrev = 'PDT'
ORDER BY 2;
TZABBREV TZ_OFFSET(TZNAME) TZNAME
PDT -06:00 America/Inuvik
PDT -07:00 US/Pacific-New
PDT -07:00 America/Ensenada
PDT -07:00 America/Dawson
PDT -07:00 America/Dawson_Creek
PDT -07:00 America/Los_Angeles
PDT -07:00 America/Tijuana
PDT -07:00 America/Vancouver
PDT -07:00 America/Whitehorse
PDT -07:00 Canada/Pacific
PDT -07:00 Canada/Yukon
PDT -07:00 Mexico/BajaNorte
PDT -07:00 PST
PDT -07:00 PST8PDT
PDT -07:00 US/Pacific
PDT -08:00 America/Juneau
您必须使用 PST
作为时区区域。然后从给定日期确定夏令时设置:
SELECT
TO_TIMESTAMP_TZ('Jan 29 14:12:56 PST 2015','Mon dd hh24:mi:ss TZR YYYY') dt_ts_winter,
TO_TIMESTAMP_TZ('Jun 29 14:12:56 PST 2015','Mon dd hh24:mi:ss TZR YYYY') dt_ts_summer
FROM dual;
DT_TS_WINTER DT_TS_SUMMER
2015-01-29 14:12:56.000000000 -08:00 2015-06-29 14:12:56.000000000 -07:00
由于您的值存储为 VARCHAR2
(现在您知道为什么不应该这样做了),您可以使用 REGEXP_REPLACE(dt_string, 'PDT', 'PST')