Сначала вы должны прикрепить часовой пояс к значению даты.Затем вы можете конвертировать его в UTC (то же самое, что и "зулу").За пределами США существует мир, который можно объединять с помощью постоянной строки.Если возможно, я бы порекомендовал перенести значения CUST_TIMEZONE
на действительные имена часовых поясов, как указано в SELECT TZNAME FROM V$TIMEZONE_NAMES
. В принципе вам необходимо выполнить следующее:
FROM_TZ(ORDER_DTTM, 'US/'||CUST_TIMEZONE) AT TIME ZONE 'UTC'
Однако FROM_TZ
ожидает значение TIMESTAMP
вместо DATE
, и Oracle не выполняет неявное приведение, поэтому вам нужно запустить
FROM_TZ(CAST(ORDER_DTTM AS TIMESTAMP), 'US/'||CUST_TIMEZONE) AT TIME ZONE 'UTC'
В результате получается значение TIMESTAMP WITH TIME ZONE
.Если вы хотите получить DATE
, вам придется снова привести результат:
CAST(FROM_TZ(CAST(ORDER_DTTM AS TIMESTAMP), 'US/'||CUST_TIMEZONE) AT TIME ZONE 'UTC' AS DATE)
Если вы конвертируете метку времени в UTC, вы также можете использовать встроенную функцию, она возвращает TIMESTAMP
значение:
SYS_EXTRACT_UTC(FROM_TZ(CAST(ORDER_DTTM AS TIMESTAMP), 'US/'||CUST_TIMEZONE))