我有一个应用程序,使用的是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)
查看结果
所有时间戳都插入了午夜时间戳,实际上to_char(..)和birth_time结果是在午夜。返回时间小于1小时(根据我的时区更正!)但是一些条目(例如,一个例如,最后一个)少两个小时(只有少数几千个是三个)!
使用 sql * plus 执行的相同查询返回正确的结果,所有条目的差异为一小时!
有没有人建议解决这个问题?
问题出现了,因为我们使用adobe flex制作的应用程序之一似乎用UTC时间执行查询,当您使用此组件查看数据时会出现问题。
PS .: “BIRTH_TIME”是TIMESTAMP(6)
答案 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