Преобразование часового пояса
Я хочу получить все записи, созданные 1 апреля 2013 года. Поскольку время и дата в БД хранятся в 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-Апр-2013 00:56:04"(оба результата уже переведены в местное время).
И запрос "Я запустил ниже", который использует время UTC в качестве ввода (1 апреля 2013 г. 00:00:00 = 31 марта 2013 г. 16:00:00), я получу правильные записи.
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 марта 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
Я надеюсь, что разъяснил свой вопрос, и я благодарен за любые советы и вклад в решение этой проблемы. Благодарю.