ORACLE SQL настраивает дату для часового пояса без приведения к метке времени или символу

#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.339021

4. Все доли секунды кажутся равными .000, так что это может быть просто артефактом инструмента базы данных, который я использую (в данном случае dbeaver), но спасибо!