转换时区问题

时间:2013-04-15 17:51:45

标签: sql database date timezone oracle-sqldeveloper

我希望获得2013年4月1日创建的所有记录。由于DB中的时间和日期以UTC格式存储,用户输入将在本地时间,我对用户输入应用时区转换,将日期(本地)转换为UTC,以便获取正确的记录。

AND SORDT.NAME = 'New Install'
AND SORD.X_ORDER_SUB_TYPE = 'New Registration'
AND SORD.CREATED >= (FROM_TZ(CAST(TO_DATE('1-Apr-2013 00:00:00','DD-MON-YYYY HH24:MI:SS') AS TIMESTAMP), 'Asia/Kuala_Lumpur') AT TIME ZONE 'UTC')
AND SORD.CREATED < (FROM_TZ(CAST(TO_DATE('2-Apr-2013 00:00:00','DD-MON-YYYY HH24:MI:SS') AS TIMESTAMP), 'Asia/Kuala_Lumpur') AT TIME ZONE 'UTC')
ORDER BY SORD.CREATED ASC

但是查询结果错了。如果我运行上面的查询,我将获得创建的第一条记录在&#34; 01-APR-2013 09:25:39&#34;(此记录之前还有其他记录)和最后一条记录(ORDER BY SORD.CREATED DESC)创建于&#34; 02-APR-2013 00:56:04&#34;(两个结果都已转换为当地时间)。

我运行下面的查询,使用UTC时间作为输入(2013年4月1日00:00:00 = 31-MAR-2013 16:00:00 utc),我会得到正确的提取的记录。

AND SORDT.NAME = 'New Install'
AND SORD.X_ORDER_SUB_TYPE = 'New Registration'
--AND SORD.CREATED >= (FROM_TZ(CAST(TO_DATE('1-Apr-2013 00:00:00','DD-MON-YYYY HH24:MI:SS') AS TIMESTAMP), 'Asia/Kuala_Lumpur') AT TIME ZONE 'UTC')
--AND SORD.CREATED < (FROM_TZ(CAST(TO_DATE('2-Apr-2013 00:00:00','DD-MON-YYYY HH24:MI:SS') AS TIMESTAMP), 'Asia/Kuala_Lumpur') AT TIME ZONE 'UTC')
AND SORD.CREATED >= TO_DATE('31-MAR-2013 16:00:00','DD-MON-YYYY HH24:MI:SS') 
AND SORD.CREATED < TO_DATE('01-APR-2013 16:00:00','DD-MON-YYYY HH24:MI:SS') 
ORDER BY SORD.CREATED ASC

返回查询,创建的第一条记录位于&#34; 01-APR-2013 00:00:36&#34;,最后一条记录位于&#34; 01-APR-2013 23:08:39&#34 ;,这是正确的。

这可能是什么问题?两者都是一回事。下面是接受用户输入参数的代码的第一部分,然后将值转换为UTC,我运行以检查值,它完全相同(输出:31-MAR-2013 16:00:00)。

SELECT
(FROM_TZ(CAST(TO_DATE('1-Apr-2013 00:00:00','DD-MON-YYYY HH24:MI:SS') AS TIMESTAMP), 'Asia/Kuala_Lumpur') AT TIME ZONE 'UTC') AS "DATE"
FROM
DUAL

我希望我明白我的问题,并感谢任何建议和意见来解决这个问题。 感谢。

0 个答案:

没有答案