1

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

しかし、クエリの結果は間違っていました。上記のクエリを実行すると、作成された最初のレコードは「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