如何将短时区的varchar转换为Oracle中的时间戳

时间:2020-11-05 13:01:08

标签: oracle

我们将日期存储在varchar2列中为“ Tue Dec 18 18:49:31 EST 2018”,我想将其转换为时间戳。尝试过to_timestamp('Tue Dec 18 16:49:31 EST 2018','DY Mon DD HH24:MI:SS TS YYYY'),但不起作用。请帮忙。

1 个答案:

答案 0 :(得分:0)

如果您想保留时区信息,则必须使用TO_TIMESTAMP_TZ,否则可以这样:

SELECT
    TO_TIMESTAMP_TZ(
        REGEXP_REPLACE(
           'Tue Dec 18 16:49:31 EST 2018', 
           '\w+ (\w+) (\d+) (\d\d:\d\d:\d\d) (\w+) (\d+)', 
           '\5-\1-\2 \3 \4'
        ), 
        'YYYY-Mon-DD HH24:MI:SS TZR',
        'NLS_DATE_LANGUAGE=American'),
    TO_TIMESTAMP(
        REGEXP_REPLACE(
           'Tue Dec 18 16:49:31 EST 2018', 
           '\w+ (\w+) (\d+) (\d\d:\d\d:\d\d) \w+ (\d+)', 
           '\4-\1-\2 \3'
        ), 
        'YYYY-Mon-DD HH24:MI:SS',
        'NLS_DATE_LANGUAGE=American')
FROM DUAL;

但是,它将在EDT上失败,请参阅:

SELECT TZNAME, TZABBREV, TZ_OFFSET(TZNAME) 
FROM V$TIMEZONE_NAMES 
WHERE TZNAME IN ('EST','EDT')

您可以使用REPLACE('Tue Dec 18 16:49:31 EDT 2018', 'EDT', 'EST5EDT')使其正常工作。