Oracle 时区转换(使用 from_tz)

标签 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

谢谢

最佳答案

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

关于Oracle 时区转换(使用 from_tz),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264350/

相关文章:

java - H2 创建链接表 - 未找到驱动程序类

r - view_zoom_manual xmin 和 xmax 使用日期 r ggplot

用于估计具有异构迭代的时间密集型循环的剩余时间的算法

python - 时间数据 '2018-06-19 11:21:13.311' 与格式不匹配

sql - Oracle PL/SQL 引用游标如何

sql - 将列中的数值分别替换为列中其他值的排名

oracle - 如何在Oracle 11g中创建用户并授予权限

javascript - 如何使用 momentjs 检查日期是否至少过去一天?

android - String dateTime to Date -> 检查是否是今天

r - R,动物园增加一小时