Oracle 10g Путаница с часовыми поясами - PullRequest
5 голосов
/ 16 января 2012
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI')
      ,TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD HH24:MI')
      ,TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR') 
      ,TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI TZR') 
      ,TO_CHAR(LOCALTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR') 
      ,DBTIMEZONE
      ,SESSIONTIMEZONE
  FROM DUAL;

Возвращается:

2012-01-16 11:42
2012-01-16 11:42    
2012-01-16 11:42 -06:00 
2012-01-16 11:42 -06:00 
2012-01-16 11:42 +00:00 
+00:00  
-06:00

Кажется, что часовой пояс базы данных - это GMT, но SYSDATE совпадает с CURRENT_DATE.

Когда я удаленно на этот сервер (Windows), часовой пояс, по-видимому, является CST (однако я знаю, что это может быть смещение моего часового пояса клиента служб терминалов, но на этом компьютере нет служб терминалов на нем , просто админ)

Запустив то же самое на сервере в Амстердаме (через 4 минуты все с того же клиента TOAD), я получаю:

2012-01-16 18:46
2012-01-16 11:46    
2012-01-16 18:46 +01:00 
2012-01-16 11:46 -06:00 
2012-01-16 11:46 +00:00 
+02:00  
-06:00

Обратите внимание на +2, но, по крайней мере, SYSDATE и CURRENT_DATE отличаются.

Что здесь происходит? Откуда происходит SYSDATE и есть ли что-то еще, что влияет на него?

Кажется, DBTIMEZONE не используется ни для одной из этих вещей? Так для чего используется DBTIMEZONE?

Ответы [ 3 ]

11 голосов
/ 06 августа 2012

Здесь на самом деле 3 часовых пояса, а не 2

  • часовой пояс сеанса / клиента
    • Показано в SESSIONTIMEZONE
    • Это часовой пояс CURRENT_DATE, LOCALTIMESTAMP и CURRENT_TIMESTAMP. Разница между этими 3 - тип возвращаемого значения, они возвращают DATE, TIMESTAMP и TIMESTAMP WITH TIME ZONE соответственно)
  • База данных часового пояса
    • Показано в DBTIMEZONE
    • Это часовой пояс, используемый для внутреннего хранения значений TIMESTAMP WITH LOCAL TIME ZONE. Обратите внимание, что при вставке / выборе значения конвертируются в / из часового пояса сеанса, поэтому на самом деле это не так важно, как кажется
    • Это НЕ часовой пояс SYSDATE / SYSTIMESTAMP
  • База данных ОС часового пояса
    • В Unix он основан на переменной TZ при запуске Oracle
    • Это часовой пояс SYSDATE и SYSTIMESTAMP

В первом примере я вижу, что TZ сеанса - это UTC-6, TZ базы данных - это UTC, а часовой пояс ОС базы данных - UTC-6.

Во втором примере я вижу, что TZ сеанса - UTC-6, TZ базы данных - UTC + 2, а часовой пояс ОС базы данных - UTC + 1.

4 голосов
/ 07 ноября 2013

Подробности указаны мелким шрифтом документации.Взгляните на тип возвращаемого значения и фактический часовой пояс, в котором рассчитывается дата или время.

  1. SYSDATE
    • тип возвращаемого значения: DATE
    • часовой пояс: хостОС сервера базы данных
  2. CURRENT_DATE
    • Тип возврата: ДАТА
    • Часовой пояс: Сеанс
  3. SYSTIMESTAMP
    • Тип возвращаемого значения: TIMESTAMP с зоной времени
    • Часовой пояс: ОС хоста сервера базы данных
  4. CURRENT_SYSTIMESTAMP
    • Тип возвращаемого значения: TIMESTAMPWITH TIME ZONE
    • Часовой пояс: Session
  5. LOCALTIMESTAMP
    • Тип возврата: TIMESTAMP
    • Часовой пояс: Session
  6. DBTIMEZONE
    • Часовой пояс: DB Time Zone.Унаследовано от ОС Сервера БД, но может быть переопределено с помощью параметра «Установить при создании БД» или «Изменить» с помощью параметра БД TIME_ZONE (SET TIME_ZONE = ...).Это влияет на часовой пояс, используемый для типов данных TIMESTAMP WITH LOCAL TIME ZONE.
  7. SESSIONTIMEZONE
    • Часовой пояс: часовой пояс сеанса.Унаследовано от ОС хостинга сессий, но может быть переопределено с помощью ALTER SESSION (ALTER SESSION SET TIME_ZONE = ...).

Return Type, указывает, доступен ли часовой пояс или нетв типе данных.Если вы попытаетесь напечатать TZR, если тип данных не содержит TimeZone, он будет отображаться как +00: 00 (не означает, что это время по Гринвичу).В противном случае будет отображаться часовой пояс, соответствующий базе данных или сеансу, как указано.

Часовой пояс, указывает, в каком часовом поясе рассчитывается время.Для сопоставления TimeZone будет показана та же дата / время (HH24: MI).

Обратите внимание, что ни один из FUNCTIONS не возвращает TIME в часовом поясе, установленном с помощью DB TIME_ZONE (или как возвращено функцией DBTIMEZONE),То есть ни одна из функций также не возвращает тип данных TIMESTAMP WITH LOCAL TIME ZONE.Однако вы можете преобразовать выходные данные любой из функций, которые возвращают часовой пояс, в другой часовой пояс (включая DBTIMEZONE) следующим образом:

SELECT SYSTIMESTAMP AT TIME ZONE DBTIMEZONE FROM DUAL;

Дополнительная информация о моем блоге .

3 голосов
/ 16 января 2012

Используйте UTC время и смещение вашего часового пояса от UTC, Чтобы получить UTC в Oracle, используйте SYS_EXTRACT_UTC

Преобразование SYSTEMDATE в UTC

    select sys_extract_utc(systimestamp) from dual;

Что касается различий, определение из документации Oracle может помочь объяснить:

  • LOCALTIMESTAMP возвращает текущую дату и время в часовом поясе сеанса в значении типа данных TIMESTAMP
  • CURRENT_TIMESTAMP возвращает текущую дату и время в часовом поясе сеанса в значении типа данных TIMESTAMP WITH TIME ZONE
  • SYSTIMESTAMP возвращает системную дату,включая дробные секунды и часовой пояс системы, в которой находится база данных
  • CURRENT_DATE возвращает текущую дату в часовом поясе сеанса в виде значения в григорианском календаре типа данных DATE.
  • SYSDATE возвращает текущую дату и время, установленные для операционной системы, в которой находится база данных.
  • DBTIMEZONE возвращает значение часового пояса базы данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...