Oracle时区转换(使用from_tz)

时间:2012-02-13 16:44:44

标签: oracle date time timezone

我正在尝试将时间(日期+时间)从一个时区转换为另一个时区。在下面的查询中,我正在尝试将时间从EST(“America / New_York”)转换为PST(“America / Los_Angeles”)。查询部分有效;结果:

DATABASE_DATE = 2012-02-13 1:00:00 PM  
LOCALTIME (what I get): 2012-02-12 10:00:00 AM.

所以时间好,但日期错了。它应该是2012-02-13而不是2012-02-12。

我做错了吗?这是我的疑问:

select to_date( to_char( ( from_tz( to_timestamp( DATABASE_DATE
                                                 , 'YYYY-MM-DD HH:MI:SS')
                                   ,'America/New_York')
                          at time zone 'America/Los_Angeles')
                       ,'YYYY-MM-DD HH:MI:SS')
               ,'YYYY-MM-DD HH:MI:SS') as localtime
 from table

由于

3 个答案:

答案 0 :(得分:6)

to_timestamp()获取一个字符串(VARCHAR2,CHAR ...)如果您尝试给它一个日期,那么oracle会根据NLS_DATE_FORMAT将其转换为字符串,这可能会因不同的环境而异并返回意外的结果(如这种情况) 你应该做的是首先使用to_char,所以你的查询看起来像这样:

select to_date(to_char((from_tz(to_timestamp(to_char(DATABASE_DATE, 'YYYY-MM-DD HH:MI:SS PM'), 'YYYY-MM-DD HH:MI:SS PM') ,'America/New_York')
at time zone 'America/Los_Angeles'),'YYYY-MM-DD HH:MI:SS PM'),'YYYY-MM-DD HH:MI:SS PM') as localtime
from table

更新:如果我理解你,那么你想要这样的东西:

select to_char((from_tz(to_timestamp(to_char(DATABASE_DATE, 'YYYY-MM-DD HH:MI:SS PM'), 'YYYY-MM-DD HH:MI:SS PM') ,'America/New_York')
    at time zone 'America/Los_Angeles'),'YYYY-MM-DD HH:MI:SS PM TZD') as localtime
    from table

答案 1 :(得分:2)

SELECT TO_CHAR(NEW_TIME(systimestamp,'EST','PST'), 'DD-MON-YY HH24:MI:SS') AS converted_timestamp_column FROM DUAL;

答案 2 :(得分:1)

请尝试这一点。在oracle中有一个用于此目的的功能

https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_2036.htm

select NEW_TIME (TO_DATE ('2011/11/11 01:45', 'yyyy/mm/dd HH24:MI'), 'AST', 'MST') from dual;