Oracle时间戳,时区和utc

时间:2013-11-21 16:00:36

标签: sql oracle flex timezone oracle-sqldeveloper

我有一个应用程序,使用的是Oracle 11g(11.2.0.2.0 64位)db。

我在Person表中有很多条目。要访问数据我正在使用不同的应用程序(相同的数据)。 在这个例子中,我正在使用my person表的birth_time字段。 有些应用程序直接用birth_time查询数据,有些用to_char重新格式化数据,还有一些用UTC函数查询。

问题是:使用相同的数据,相同的查询,结果是不同的。

在此屏幕截图中,您可以使用 Oracle Sql开发人员(3.2.20.09)

查看结果

Query with Sql developer

所有时间戳都插入了午夜时间戳,实际上to_char(..)和birth_time结果是在午夜。返回时间小于1小时(根据我的时区更正!)但是一些条目(例如,一个例如,最后一个)少两个小时(只有少数几千个是三个)!

使用 sql * plus 执行的相同查询返回正确的结果,所有条目的差异为一小时!

有没有人建议解决这个问题?

问题出现了,因为我们使用adobe flex制作的应用程序之一似乎用UTC时间执行查询,当您使用此组件查看数据时会出现问题。

PS .: “BIRTH_TIME”是TIMESTAMP(6)

1 个答案:

答案 0 :(得分:1)

您是否可以更改使用的查询?如果是这样,您可以使用AT TIME ZONE表达式告诉Oracle此日期位于UTC时区:

SELECT SYS_EXTRACT_UTC(CAST(TRUNC(SYSDATE) AS TIMESTAMP)) AS val FROM dual;

输出:

VAL                        
----------------------------
13/11/20 23:00:00,000000000 

现在,使用AT TIME ZONE 'UTC'可以获得您需要的日期:

SELECT SYS_EXTRACT_UTC(
          CAST(
            TRUNC(SYSDATE) AS TIMESTAMP)
          AT TIME ZONE 'UTC') AS val FROM dual;

输出:

VAL                        
----------------------------
13/11/21 00:00:00,000000000