Функция SYS_EXTRACT_UTC
работает только со значениями TIMESTAMP WITH TIME ZONE
или TIMESTAMP WITH LOCAL TIME ZONE
.DATE
и TIMESTAMP
не содержат никакой информации о часовом поясе, поэтому SYS_EXTRACT_UTC
в основном бесполезен для значений DATE
или TIMESTAMP
.
Когда вы запускаете
SYS_EXTRACT_UTC(CAST(SYSDATE AS TIMESTAMP))
затем Oracle выполняет неявное приведение и фактически выполняет
SYS_EXTRACT_UTC(FROM_TZ(CAST(SYSDATE AS TIMESTAMP), SESSIONTIMEZONE))
SYSDATE
и SYSTIMESTAMP
возвращает время в часовом поясе операционной системы сервера базы данных ( NOT DBTIMEZONE
), тогда как ваша командаиспользует текущий сеанс SESSIONTIMEZONE
Если вы настаиваете на использовании значения DATE
, вы можете использовать это:
SYS_EXTRACT_UTC(FROM_TZ(CAST(SYSDATE AS TIMESTAMP), TO_CHAR(SYSTIMESTAMP, 'tzr')))
TO_CHAR(SYSTIMESTAMP, 'tzr')
предоставляет вам часовой пояс сервера базы данныхоперационная система.
Просто обратите внимание, очень часто часовой пояс операционной системы сервера базы данных не является регионом, подобным Europe/Zurich
, а меняется два раза в год между +01:00
и +02:00
из-за перехода на летнее время.Для SYSDATE
и SYSTIMESTAMP
это не имеет значения, поскольку смещение current UTC всегда корректно.Но, например, если моя таблица содержит значение DATE 2018-08-01 12:00:00
, вы получите неверный результат, если выполните запрос сверху сегодня в ноябре.
Если ваш сервер баз данных использует летнее время, лучше использовать такой запрос, как
SYS_EXTRACT_UTC(FROM_TZ(CAST({arbitrary DATE value} AS TIMESTAMP), 'Europe/Zurich'))