1

我想获取 2013 年 4 月 1 日创建的所有记录。由于数据库中的时间和日期存储在 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

但是查询结果是错误的。如果我运行上面的查询,我会在“01-APR-2013 09:25:39”上创建第一条记录(在此记录之前创建了其他记录),最后一条记录(ORDER BY SORD.CREATED DESC)创建时间为“02-APR-2013 00:56:04”(两个结果都已转换为本地时间)。

我运行下面的查询,它使用 UTC 时间作为输入(1-Apr-2013 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

返回的查询,创建的第一条记录在“01-APR-2013 00:00:36”,最后一条记录在“01-APR-2013 23:08:39”,这是正确的。

这里可能是什么问题?两者都是一回事。下面是接受用户输入参数的代码的第一部分,然后将值转换为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

我希望我把我的问题说清楚了,我感谢任何解决这个问题的建议和意见。谢谢。

4

0 回答 0