Oracle рассматривает EET как раз название зоны региона (SELECT tzname, tzabbrev FROM V$TIMEZONE_NAMES WHERE tzname = 'EET'
, или увидеть the docs) так ручки дневного света экономия/летнее время (EEST/EEDT). В 2011-09-26 EET регионwas actually EEST, так что это было на три часа раньше UTC, а не два; и поскольку IST всегда +05: 30, смещение было фактически +02: 30. Таким образом, ваш результат «правильный».
Вместо того, чтобы возвращаться назад и вперед к строке, вы можете использовать функцию from_tz
, чтобы изменить обычную временную метку в метку времени с часовым поясом; а затем at time zone
получить, что в другой зоне:
select to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') orig_ts,
from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
'EET') orig_tsz,
sys_extract_utc(from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
'EET')) orig_utc,
from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
'EET') at time zone 'Asia/Calcutta' new_tsz
from dual;
ORIG_TS ORIG_TSZ ORIG_UTC NEW_TSZ
------------------- -------------------------- ------------------- ---------------------------------
2011-09-26 21:00:00 2011-09-26 21:00:00 EET 2011-09-26 18:00:00 2011-09-26 23:30:00 ASIA/CALCUTTA
«т» в исходной строке обозначает время, и обозначает «Z» (или предполагается!), что представляет собой дату/время в UTC; это the ISO 8601 standard notation. Функции преобразования Oracle позволяют вам игнорировать эти embed character literals in the format model. Поскольку у него есть «Z», вы должны рассматривать его как UTC, а не EET, поэтому вам может понадобиться вернуться к тому, с кем вы получаете эти значения.
Если вы действительно ожидаете, что все значений, чтобы быть от EET часового пояса, без летнего времени смещения, то вы могли использовать фиксированный TZH: ПЗМ, а не название региона:
select to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') orig_ts,
from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
'+02:00') orig_tsz,
sys_extract_utc(from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
'+02:00')) orig_utc,
from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
'+02:00') at time zone 'Asia/Calcutta' new_tsz
from dual;
ORIG_TS ORIG_TSZ ORIG_UTC NEW_TSZ
------------------- -------------------------- ------------------- ---------------------------------
2011-09-26 21:00:00 2011-09-26 21:00:00 +02:00 2011-09-26 19:00:00 2011-09-27 00:30:00 ASIA/CALCUTTA
я сомневаюсь, что на самом деле то, что вы хотите, но вам нужно будет уточнить ваши требования.
Наконец, чтобы получить преобразованное значение обратно в исходный формат, который вы должны использовать to_char
:
select to_char(from_tz(to_timestamp('2011-09-26T21:00:00Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'EET') at time zone 'Asia/Calcutta',
'YYYY-MM-DD HH24:MI:SS') new_string
from dual;
NEW_STRING
-------------------
2011-09-26 23:30:00
можно встроить «T» обратно в с 'YYYY-MM-DD"T"HH24:MI:SS'
; добавление «Z» обратно в конец кажется неправильным.
Если ваше время источник из Берлина, как ваш вопрос редактировать предполагает (что CET/CEST, не EET/EEST, получая, что не хватает час) просто изменить from_tz
область:
select to_char(from_tz(to_timestamp('2011-09-26T21:00:00Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'Europe/Berlin') at time zone 'Asia/Calcutta',
'YYYY-MM-DD"T"HH24:MI:SS') new_string
from dual;
NEW_STRING
-------------------
2011-09-27T00:30:00
Будет не дата в сентябре будет EEST, а не EET ([в большинстве мест] (http://www.timeanddate.com/time/zones/eet))? У вас есть область, которую вы можете назначить исходной временной отметке, а не EET? Но «Z» в строке предполагается, что это [время UTC] (https://en.wikipedia.org/wiki/ISO_8601#UTC), поэтому что-то уже не так ... –
У меня есть последний запрос с регионом. Теперь я получаю вывод, но это не в требуемом формате. Можете ли вы сказать, как его преобразовать? – Crazy2crack