#oracle #date #datetime #oracle-sqldeveloper #timezone-offset
#Oracle #Дата #дата и время #oracle-разработчик sqld #смещение часового пояса
Вопрос:
Для ORACLE SQL, Oracle Database 19c Standard Edition 2 Выпуск 19.0.0.0.0 — Производство,
Есть ли способ преобразовать дату (включая дату/время) из GMT в местное время (с учетом корректировки на летнее время) непосредственно в качестве даты (включая дату/время)?
Я видел несколько решений, которые включают временные метки или используют временные метки и преобразования символов с соответствующим смещением часового пояса.
Тем не менее, я хотел бы сохранить все в качестве даты.
Пример использования преобразования временных меток:
SELECT OUR_DATE, from_tz(cast( OUR_DATE as timestamp), 'GMT') at time zone 'US/Eastern' from OUR_DB.OUR_TBL;
Комментарии:
1. Не уверен, что «пример» должен иллюстрировать. В нем есть несколько синтаксических ошибок (фатальных — Oracle будет просто выдавать одну ошибку за другой, когда вы их исправляете), так что, возможно, это не лучший возможный пример. Кроме того: поскольку Oracle использует концепцию «часового пояса» только для меток времени, а не для дат, вы не можете сделать это напрямую. Но что плохого в преобразовании даты в метку времени с часовым поясом, преобразовании в нужный вам часовой пояс, а затем преобразовании обратно в дату (включая время суток), если это то, что вам нужно в конце концов?
2. Кроме того, вам нужно преобразовать в » локальный » часовой пояс (это означает, что если два разных пользователя находятся в разных часовых поясах, они получают разные результаты), или вам нужно преобразовать в фиксированный, жестко заданный часовой пояс, например
US/Central
? Oracle может делать и то, и другое — и это не одно и то же!3. Настройка DST зависит от часового пояса и от того, как вы его представляете. Вы можете указать часовой пояс, например, -05:00 — это фиксированное смещение от GMT (без корректировки на летнее время). Регионы часовых поясов, такие как вы используете (
US/Eastern
), имеют автоматическую настройку летнего времени, но вы должны убедиться, что база данных обновлена в соответствии с возможными изменениями в местных правилах летнего времени, которые со временем меняются.4. Термин
GMT
немного старомоден. В настоящее время вы используетеUTC
5. @WernfriedDomscheit — Это правда, но это всего лишь вопрос практики в отрасли; теоретически GMT прав, а UTC ошибочен. GMT-это часовой пояс; UTC-нет, это стандарт, на котором основаны часовые пояса (включая GMT). Метка времени, технически говоря, не может находиться в «часовом поясе UTC» — такой вещи не существует. Однако вы правы в том, что общее использование UTC — как бы неправильно это ни было.
Ответ №1:
Похоже, вам нужно что-то подобное (что было бы намного проще, если бы у Oracle также были типы данных «дата с отметкой времени»):
... cast(from_tz(cast(your_date as timestamp), 'UTC') at time zone 'US/Eastern' as date) as your_column_alias ...
Приведите дату в качестве метки времени, чтобы вы могли указать ей часовой пояс ( UTC
новый GMT
— это отдельная проблема), преобразовать в нужный часовой пояс, а затем преобразовать обратно в дату — без часового пояса, без доли секунды.
Комментарии:
1. Очень милый. Вопрос: Означает ли DST автоматически «США/Центральный»?
2. Наблюдение: В моей системе «дата» Оракула на самом деле является датой/временем с нетривиальным временем, и у нее есть доли секунды, что для меня здесь не является проблемой, хотя в некоторых отчетах они могут раздражать.
3. @JosephDoggie —
US/Central
действительно, в нем есть DST. Что касается вашего наблюдения: Во всех системах Oracle тип данных «дата» включает время суток; это может быть 00:00:00 (полночь), но оно всегда присутствует. Но вот еще что… нет, в вашей базеdate
данных Oracle в типе данных нет доли секунды. Если это так, то это не Оракул. Именно в этом заключается различие между «датой» и «меткой времени» (без компонента часового пояса). Возможно, мы говорим не об одном и том же; «доли секунды» означает то, что в конце 03:14:25.3390214. Все доли секунды кажутся равными .000, так что это может быть просто артефактом инструмента базы данных, который я использую (в данном случае dbeaver), но спасибо!