2015-07-31 8 views
1

У меня есть дата, скажем 2011-09-26T21:00:00Z. Я не уверен, что такое T и Z в обозначенную дату. Это EET раз. Мне нужно преобразовать это в местное время «IST».Дата Преобразование одного часового пояса в другой часовой пояс

Ожидаемое O/P:.. 2011-09-27T00:30:00Z (так как у нас есть 3 часа 30 минут разница в ч/б EET и IST Даже 2011-09-27 00:30:002011-09-27 или (по крайней мере случае) это нормально для меня

Я пытаюсь ниже запрос, но получаю ошибку, как TimeZone region not found

select to_char((from_tz(to_timestamp(to_char('2011-09-26T21:00:00Z','YYYY-MM-DD HH24:MI:SS') 
              ,'YYYY-MM-DD HH:MI:SS PM') ,'EET') 
     at time zone 'IST'),'YYYY-MM-DD HH:MI:SS PM TZD') as localtime 
     from dual; 

Кто-то пожалуйста предложить какие-либо другие способы преобразования

UPDATE:. Я пробовал следующий запрос. Это дает результат. Но это не желаемый формат.

select TO_TIMESTAMP_TZ(TO_CHAR((to_timestamp('2011-09-26 21:00:00','yyyy/mm/dd hh24:mi:ss')), 
         'yyyy/mm/dd hh24:mi:ss')||' Europe/Berlin', 
         'yyyy/mm/dd hh24:mi:ss tzr') AT TIME ZONE 'Asia/Calcutta' ts_eet 
      from dual; 

ВЫВОД: 27-SEP-11 12.30.00.000000000 AM ASIA/CALCUTTA. Здесь я одна проблема 1) Я не хочу SEP в месяц вместо того, чтобы я нужен только 09 и формат должен быть таким же, как 2011-09-27

+0

Будет не дата в сентябре будет EEST, а не EET ([в большинстве мест] (http://www.timeanddate.com/time/zones/eet))? У вас есть область, которую вы можете назначить исходной временной отметке, а не EET? Но «Z» в строке предполагается, что это [время UTC] (https://en.wikipedia.org/wiki/ISO_8601#UTC), поэтому что-то уже не так ... –

+0

У меня есть последний запрос с регионом. Теперь я получаю вывод, но это не в требуемом формате. Можете ли вы сказать, как его преобразовать? – Crazy2crack

ответ

0

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 
+0

Спасибо за очень хорошее объяснение :) Это сработало @AlexPoole – Crazy2crack

Смежные вопросы